powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Трудности составления запроса через ORM
14 сообщений из 14, страница 1 из 1
Трудности составления запроса через ORM
    #38664913
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 таблицы, пользователи и список их операций. запрос должен выполняться N-ое кол-во раз, меняется только дата.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE TABLE operations
(
  id serial NOT NULL,
  userid integer,
  date_record timestamp without time zone,
  CONSTRAINT operations_pkey PRIMARY KEY (id)
}


CREATE TABLE users
(
  id serial NOT NULL,
  name character varying(50),
  groupid integer,
  CONSTRAINT users_pkey PRIMARY KEY (id)
}



Нужно получить список ВСЕХ пользователей и кол-во операций за определенный день.

Запрос такой:

Код: sql
1.
2.
3.
4.
5.
select t1.id, t1.name, count(t2.*)
from users t1
left join operations t2 on t1.userid = t2.id and t2.date_record::date='06.05.2014'::date
where t1.group=1
group by t1.id, t1.name



В принципе, все работает. Но проблема в том что запросы формируются не через SQL, а через подобие ORM, а там я могу менять только условия во WHERE, все условия в JOIN задаются во время создания объекта и дальше не меняются. Каким то образом нужно перенести
Код: plaintext
t2.date_record::date='06.05.2014'::date
в WHERE.

Если делаю так:
Код: sql
1.
2.
3.
4.
5.
select t1.id, t1.name, count(t2.*)
from users t1
left join operations t2 on t1.userid = t2.id
where t1.group=1 and t2.date_record::date='06.05.2014'::date
group by t1.id, t1.name



тогда пользователи у которых нет соответствующих записей в operations не войдут в результат, а нужно чтоб они были с нулем.
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38664967
drsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folibis,

and (t2.date_record::date='06.05.2014'::date or t2.date_record is null)
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38665307
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Oh, shit! Просто и гениально, стоило посмотреть результат без GROUP BY. Спасибо, @drsm
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38665801
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя я сейчас попробовал, не получается.
по условию
Код: plaintext
and (t2.date_record::date='06.05.2014'::date or t2.date_record is null)
берутся записи либо за указанное число, либо те users которых вообще нет в operations. А те users которые есть. но за другое число просто не попадают
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38665856
какабычна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FolibisХотя я сейчас попробовал, не получается.
..
и это хорошо

потому что "просто и гениально" -- выбросить ср@ное овно, именуемое ормом
а тем паче - подобием

было бы правильным поймать автора орма, и , оторвав выпуклости, забить их во впуклости
но ,какабычна, "йузер орма" стоит ниже в иерархии говнокодеров, чем аффтыр ср@ного орма
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38666128
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FolibisХотя я сейчас попробовал, не получается.
по условию
Код: plaintext
and (t2.date_record::date='06.05.2014'::date or t2.date_record is null)
берутся записи либо за указанное число, либо те users которых вообще нет в operations. А те users которые есть. но за другое число просто не попадают

если вам очень хочется сделать костыль то:
Код: plsql
1.
2.
3.
4.
select t1.id, t1.name, sum((t2.date_record::date='06.05.2014'::date)::integer) 
from users t1 
left join operations t2 on t1.userid = t2.id 
where t1.group=1 group by t1.id, t1.name



или

Код: plsql
1.
2.
3.
select t1.id, t1.name, (select count(*) from operations t2 where t1.userid = t2.id and t2.date_record::date='06.05.2014'::date) 
from users t1
where t1.group=1



PS: оба варианта будут плохие если таблица operations большая... но при правильных индексах второй вариант всетаки получше...

--Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38667033
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
какабычнабыло бы правильным поймать автора орма, и , оторвав выпуклости, забить их во впуклости
Тсс ... потише брат, так точно ничего не решить ))

Выбросить не получится, на этом построено все приложение. Ну, можно конечно, но ....
И хотелось бы услышать мнение автора на вопрос - "Что использовать, если использовать SQL напрямую нельзя?" Логика приложения на скриптах и QRM нужен именно для этого - как для безопасности. так и для удобства не совсем программистов.

Maxim Boguk оба варианта будут плохие если таблица operations большая... но при правильных индексах второй вариант всетаки получше.

Тоже думал над такими вариантами, оставлю их как последний вариант. Пока решил, все таки, дописать функционал ORM движка.

Всем спасибо за советы!
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38668182
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Folibisкакабычнабыло бы правильным поймать автора орма, и , оторвав выпуклости, забить их во впуклости
Тсс ... потише брат, так точно ничего не решить ))

Выбросить не получится, на этом построено все приложение. Ну, можно конечно, но ....
И хотелось бы услышать мнение автора на вопрос - "Что использовать, если использовать SQL напрямую нельзя?" Логика приложения на скриптах и QRM нужен именно для этого - как для безопасности. так и для удобства не совсем программистов.

Каша какая-то.

ORM это в принципе неработающая концепция. И никакой связи с безопасностью или удобством там нет.
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38668926
alex564657498765453
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мдя... а вот бы учить SQL было бы совсем круто :)

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
select * from t left join tt on (t.i = tt.i)

EQUAL

select * from t,tt
where t.i*= tt.i


=*(right join)
=(join)
  (cross join)

правда разница конечно есть.

во первых ансишный синтаксис устарел, и некоторые субд в строгом режиме его не принимают
(ибо секция веар в строгом режиме должна быть адитивной - от перестановки порядка обработки её не должен менять результат - а вот с левыми правыми соединениями, если их несколько результат зависит от порядка выполнения)

во вторых ...счас не помню но там есть ещо один прикол в разнице вывода...
если память не изменяет
то дело в таком

t left join tt on (t.i = t.ii)  --- в выборку попадет запись где t.i IS NULL
при ансишном синтаксисе нет
(впринципе оно и понятно, секция веар получает полное произведение таблиц и потом для неё будет NULL *= 10  - а любая операция с нул кроме из(нот) нулл заканчиваеться не удачей, и отсекаеться значение. в секции фром соединение работает иначе, берёться вся левая таблица и к ней уже домалёвуем если есть что правую)


НАщот ОРМ - если это толковая орм - а большинство пусть и приметивные но толковые, там 
есть такая вещь как инлайн код, тоесть можно через метод задав чтото получить кусок скл строки, а можно задать прямо...

на кохане это DB::expr('moi kod kotorii bez obrabotki stanet 4astu sql coda')

например там где нужно указать имя таблицы ввиде строки, можно указать 
DB::expr('table1 left join table2 on ....');
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38669514
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex564657498765453, толковых ORM не бывает - вам везде придётся использовать онлайн код. (Если вам не пришлось его использовать значит вам не нужна RDBMS вообще.)

Так зачем себя мучить? Пишите просто код-прокладку.

Вот, по теме:
http://www.sql.ru/forum/1062870/nuzhen-nekiy-proksi-ne-vstrechali
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38669557
Weed
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> онлайн код.

инлайн-код, конечно же
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38669996
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На счет инлайн-кода. В принципе, у меня такая возможность есть, но отключена.
Чтоб какой нибудь умник не "пошутил" на 1-ое апреля, что то типа "А вставь как там DROP DATABASE и все станет работать в 2 раза быстрее"
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38670036
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FolibisНа счет инлайн-кода. В принципе, у меня такая возможность есть, но отключена.
Чтоб какой нибудь умник не "пошутил" на 1-ое апреля, что то типа "А вставь как там DROP DATABASE и все станет работать в 2 раза быстрее"

Такие вещи куда более надежно прикрывать правами:
а именно у веб пользователя (и вообще пользователей из под которых ходят приложения) не должно быть прав на alter/create/drop/truncate/etc (и кстати даже на DELETE из тех таблиц workflow которых этого самого DELETE не предусматривает).

А то последнее время модно веб сайт на базу пускать из под superuser (а потом удивлятся указанным вами проблемам).
...
Рейтинг: 0 / 0
Трудности составления запроса через ORM
    #38671145
Folibis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukТакие вещи куда более надежно прикрывать правами:
Согласен! Это я, конечно, не подумавши написал )
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Трудности составления запроса через ORM
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]