Имя: Пароль:
IT
 
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) не стоит благодарности.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.