Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Трудности составления запроса через ORM / 14 сообщений из 14, страница 1 из 1
09.06.2014, 08:29:33
    #38664913
Folibis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
Есть 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
09.06.2014, 09:43:10
    #38664967
drsm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
Folibis,

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

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

было бы правильным поймать автора орма, и , оторвав выпуклости, забить их во впуклости
но ,какабычна, "йузер орма" стоит ниже в иерархии говнокодеров, чем аффтыр ср@ного орма
...
Рейтинг: 0 / 0
10.06.2014, 11:41:13
    #38666128
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
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
11.06.2014, 01:58:16
    #38667033
Folibis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
какабычнабыло бы правильным поймать автора орма, и , оторвав выпуклости, забить их во впуклости
Тсс ... потише брат, так точно ничего не решить ))

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

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

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

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

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

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

ORM это в принципе неработающая концепция. И никакой связи с безопасностью или удобством там нет.
...
Рейтинг: 0 / 0
13.06.2014, 13:59:40
    #38668926
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
Мдя... а вот бы учить 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
15.06.2014, 00:32:20
    #38669514
Weed
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Трудности составления запроса через ORM
alex564657498765453, толковых ORM не бывает - вам везде придётся использовать онлайн код. (Если вам не пришлось его использовать значит вам не нужна RDBMS вообще.)

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

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

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

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

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


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