Задавайте вопросы, мы ответим
Вы не зашли.
Существует 2 таблицы.
table: groups
group_id | name
--------------------
1 | text
2 | text
3 | text
4 | text
5 | text
table: items
item_id | group_id
------------------
1 | 1
2 | 1
3 | 1
4 | 2
5 | 2
Нужно вынуть все записи из groups и к каждой записи присоединить одну запись из items (первую либо любую запись)
В принципе это можно сделать так:
SELECT * FROM groups g
LEFT JOIN (SELECT * FROM items group by group_id) i ON(g.group_id=i.group_id)
Тут запрос "SELECT * FROM items group by group_id" является тяжёлым.
Есть какое то другое решение ?
Неактивен
А зачем тут вообще подзапрос? Сделайте просто LEFT JOIN items?
Неактивен
paulus написал:
А зачем тут вообще подзапрос? Сделайте просто LEFT JOIN items?
Нет, такой вариант не подходит, так как items содержит много записей связных с groups, а мне нужно только одна запись с каждой группы.
Оптимальный вариант нашёл :
Неактивен
evgeny написал:
paulus написал:
А зачем тут вообще подзапрос? Сделайте просто LEFT JOIN items?
Нет, такой вариант не подходит, так как items содержит много записей связных с groups, а мне нужно только одна запись с каждой группы.
Оптимальный вариант нашёл :SELECT g.*,
(SELECT item_id FROM items i where g.group_id=i.group_id limit 1) as item_id
FROM groups g
Работает быстро.
Спасибо! Очень элегантное решение, не видел такого на разных там StackOverFlow - работает заметно быстрее join'а.
Неактивен
Стандартное решение в таких случаях.
Но, в отличие от join, имеет недостаток - подзапрос должен возвращать только одну колонку.
Если нужно вернуть из связанной таблицы несколько колонок, то или обычный join с группировкой или несколько одинаковых подзапросов для получения каждой колонки.
Неактивен