|   |   | 
| 
 | 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) не стоит благодарности.     | 
 
 | Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |