2015-01-14 6 views
1

Я использую mysql/mariadb.Можно ли объединить эти операторы выбора SQL?

Что я хочу сделать: Получить id, name, private для каждого Group/затем получить число Video с в каждом Group/затем получить последние 20 Video с для каждого Group.

В настоящее время я использую три отдельных SQL-запроса, а затем каждый раз запускаю их для каждого соответствующего идентификатора. Есть ли способ объединить три SQL-запроса в один и запустить их по списку идентификаторов?

Например, на группы 1,2,3:

Executing (default): select `id`, `name`, `private` from `Groups` where `id` = '1' limit 1 
Executing (default): select `id`, `name`, `private` from `Groups` where `id` = '2' limit 1 
Executing (default): select `id`, `name`, `private` from `Groups` where `id` = '3' limit 1 

Executing (default): select count(*) from `Videos` where `GroupId` = '1' and `live` = true 
Executing (default): select count(*) from `Videos` where `GroupId` = '2' and `live` = true 
Executing (default): select count(*) from `Videos` where `GroupId` = '3' and `live` = true 

Executing (default): select `id`, `file` from `Videos` where `GroupId` = '1' and `live` = true order by `id` desc limit 20 
Executing (default): select `id`, `file` from `Videos` where `GroupId` = '2' and `live` = true order by `id` desc limit 20 
Executing (default): select `id`, `file` from `Videos` where `GroupId` = '3' and `live` = true order by `id` desc limit 20 

ответ

0

Использование IN

Executing (default): (SELECT `id`, `name`, `private` FROM `Groups` WHERE`id` = '1' LIMIT 1) 
        UNION ALL 
        (SELECT `id`, `name`, `private` FROM `Groups` WHERE`id` = '2' LIMIT 1) 
        UNION ALL 
        (SELECT `id`, `name`, `private` FROM `Groups` WHERE`id` = '3' LIMIT 1) 

Executing (default): SELECT count(*) 
        FROM `Videos` 
        WHERE `GroupId` IN ('1', '2', '3') AND `live` = true 

Executing (default): (SELECT `id`, `file` FROM `Videos` WHERE`GroupId` = '1' AND `live` = true ORDER BY `id` DESC LIMIT 20) 
        UNION ALL 
        (SELECT `id`, `file` FROM `Videos` WHERE`GroupId` = '2' AND `live` = true ORDER BY `id` DESC LIMIT 20) 
        UNION ALL 
        (SELECT `id`, `file` FROM `Videos` WHERE`GroupId` = '3' AND `live` = true ORDER BY `id` DESC LIMIT 20) 
+0

Могу ли я эффективно сломать три запроса в один или два запроса, или это минимальное количество запросы, необходимые для получения необходимых данных? – switz

+0

Зависит, если таблицы имеют ссылку друг на друга и как вы хотите, чтобы данные были выведены – Matt

+0

. Она дает только первую запись 1/2/3, но для опроса нужны все три записи –

Смежные вопросы