|
SQL запрос с подзапросом | ☑ | ||
---|---|---|---|---|
0
Coldboy
23.09.13
✎
10:25
|
Здравствуйте. У меня есть SQL запрос, который выбирает нужные данные, и нужно относительно этих данных еще сделать один подзапрос, чтобы дополнить эти данные, и чтобы это было в 1 запросе. Примерно конструкция есть, но работает я считаю медленно как сделать быстрее. На данный момент имею такое:
SELECT s.channel_id,us.service_id, c.name, c.mcast, c.sort, c.logo, c.rating ( SELECT GROUP_CONCAT( concat(DATE_FORMAT(epg.time_start, '%H:%i' ),'-',DATE_FORMAT(epg.time_end, '%H:%i' ),'@',epg.name)) FROM iptv.btv_programs epg WHERE epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id ) as descrp, ( SELECT epg.time_start FROM iptv.btv_programs epg WHERE epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id ) as starttime, ( SELECT epg.time_end FROM iptv.btv_programs epg WHERE epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id ) as endtime FROM iptv.btv_channel_services s,iptv.iptv_user_services us, iptv.btv_channels c where s.service_id = us.service_id and us.user_id =$tid and c.id = s.channel_id and NOT ( us.service_id IN (2,3,4,5,6)) group by channel_id order by c.sort |
|||
1
Coldboy
23.09.13
✎
10:29
|
скорость работы замедляют эти подзапросы
(SELECT epg.time_start FROM iptv.btv_programs epg WHERE epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id ) as starttime, их аж 3 штуки, не знаю как их в 1 объединить, чтобы разом получить все данные. |
|||
2
Apokalipsec
23.09.13
✎
10:32
|
из одной таблицы выбираешь три разных поля, с одинаковыми условиями, но тремя запросами??
|
|||
3
Ёпрст
23.09.13
✎
10:36
|
как бэ..кросс джоин сам не быстрый, ну и GROUP_CONCAT тоже не быстрая операция
|
|||
4
Coldboy
23.09.13
✎
11:01
|
(2) а нельзя в одном подзапросе сразу 3 поля выбрать к сожалению...
|
|||
5
Coldboy
23.09.13
✎
11:01
|
(3) хотелось бы от него уйти и ускорить, все эти 3 подзапроса в 1 превратить.
|
|||
6
Coldboy
23.09.13
✎
11:10
|
up
|
|||
7
Coldboy
23.09.13
✎
11:17
|
даже не против, если дадут в какой раздел части mysql Запросов смотреть, чтобы составить более быстрый запрос.
|
|||
8
Coldboy
23.09.13
✎
12:29
|
Up!
|
|||
9
IVAL
23.09.13
✎
12:36
|
Не знаю, как в mySQL, а в MS SQL можно примерно так:
select descr, starttime, endtime from (SELECT GROUP_CONCAT( concat(DATE_FORMAT(epg.time_start, '%H:%i' ),'-',DATE_FORMAT(epg.time_end, '%H:%i' ),'@',epg.name)) as descr, epg.time_end as endtime, epg.time_start as starttime, FROM iptv.btv_programs epg WHERE epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id ) as tmptbl Ну и с остальной частью запроса эту таблицу связать можно, соответственно. |
|||
10
Coldboy
23.09.13
✎
12:37
|
(9) 2 раза from?
|
|||
11
Coldboy
23.09.13
✎
15:31
|
up
|
|||
12
Ёпрст
23.09.13
✎
15:34
|
(9) результат будет не таким. Там через кросс, в начале все возможные комбинации получают, и потому ужо гроупконкат
|
|||
13
Coldboy
23.09.13
✎
15:42
|
(12) груп контакт не важен. важно чтобы добрались нужные поля, если они есть, если нет то пусть будет null и все.
|
|||
14
Ёпрст
23.09.13
✎
15:44
|
(13) у тебя грубо говоря, получаются все возможные комбинации с полей таблички.. и потом объединяются в гроупконкате.. усё.
Как это еще можно оптимизировать, хз. |
|||
15
Coldboy
23.09.13
✎
15:51
|
по идеи я вижу это так.
выбираю сначала нужные мне данные типа id знач 1 0 2 3 3 5 6 7 Далее лезу в таблицу program для описания знач в нужный промежуток и на выходе хочу получить следующее: id Знач опис 1 0 null 2 3 описание эл 3 5 еще одно 6 7 null |
|||
16
КонецЦикла
23.09.13
✎
15:52
|
Нечетал, но можно запихнуть во временную таблицу с нужными индексами результат одного из запросов
|
|||
17
Coldboy
23.09.13
✎
15:57
|
(16) а точнее?
|
|||
18
КонецЦикла
23.09.13
✎
16:18
|
(17) Ну к твоему примеру нет времени писать
http://1c911.by/stati_1s/statya-primery-resheniya-nestandartnyh-zadach-na-t-sql-v-1s.htm#4 |
|||
19
kokamoonga
24.09.13
✎
06:32
|
(0) по виду вроде похоже на MySQL, но написано так будто JOIN'ов в этом SQL диалекте в принципе не существует.
вот эта часть: FROM iptv.btv_channel_services s,iptv.iptv_user_services us, iptv.btv_channels c where s.service_id = us.service_id and us.user_id =$tid and c.id = s.channel_id and NOT ( us.service_id IN (2,3,4,5,6)) group by channel_id order by c.sort таблицы iptv.btv_channel_services, iptv.iptv_user_services, iptv.btv_channels через джойны не выбираются чтоли? нафига эти дикие условия? да собственно и channel_id джойнится вполне нормально. подзапросы имеют какой-то сакральный смысл? (0) по виду вроде похоже на MySQL, но написано так будто JOIN'ов в этом SQL диалекте в принципе не существует. вот эта часть: FROM iptv.btv_channel_services s,iptv.iptv_user_services us, iptv.btv_channels c where s.service_id = us.service_id and us.user_id =$tid and c.id = s.channel_id and NOT ( us.service_id IN (2,3,4,5,6)) group by channel_id order by c.sort |
|||
20
kokamoonga
24.09.13
✎
06:33
|
как-то примерно так это должно выглядеть:
SELECT s.channel_id, us.service_id, c.name, c.mcast, c.sort, c.logo, c.rating, GROUP_CONCAT( concat(DATE_FORMAT(epg.time_start, '%H:%i' ),'-',DATE_FORMAT(epg.time_end, '%H:%i' ),'@',epg.name)) as descrp, epg.time_start as start time, epg.time_end as end time FROM iptv.btv_channel_services s LEFT OUTER JOIN iptv.iptv_user_services us ON s.service_id = us.service_id LEFT OUTER JOIN iptv.btv_channels c ON s.service_id = c.id LEFT OUTER JOIN iptv.btv_programs epg ON epg.channel_id = s.channel_id WHERE us.user_id =$tid AND c.id = s.channel_id AND NOT ( us.service_id IN (2,3,4,5,6)) AND epg.time_start <= '$tekdata' AND time_end >= '$tekdata' AND epg.channel_id = s.channel_id GROUP BY channel_id ORDER BY c.sort |
|||
21
Ёпрст
24.09.13
✎
08:56
|
(20) неа, ему из всех возможных комбинаций гроупконкат нужон в конце..
|
|||
22
Salimbek
24.09.13
✎
09:56
|
(21) Тут заковыка в том, что твое мнение основывается на запросе из (0), а ведь может быть, что ему фактически нужно именно (20) просто он еще не знает об этом ;-)
|
|||
23
kokamoonga
24.09.13
✎
16:51
|
(21) я и написал "примерно". скорее всего например в списке джойнов на первом месте ему нужна таблица iptv.iptv_user_services us. я же не в курсе чего он там хочет получить в результате и о структуре таблиц не в курсе. но то, что написано в (0) пишется джойнами, а не этим дикими условиями и подзапросами.
|
|||
24
Coldboy
24.09.13
✎
16:54
|
(23) джойном и сделал ...
|
|||
25
Ёпрст
24.09.13
✎
16:55
|
(22) ааа.. ну тогда хз, чего ему нужно :)
|
|||
26
kokamoonga
24.09.13
✎
17:10
|
(24) не стоит благодарности.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |