Задать вопрос

Выборка списка из отдельной таблицы

Есть две таблицы.
id | title
---------
1 | my title
2 | other title

id | sourceid | name
-------------------------
1 | 1 | name1
2 | 2 | name2
3 | 1 | name3


Как извлечь одним запросом данные из первой таблицы и список из name из второй таблицы?
Т.е. результат должен быть «1», «my title», «name1, name3».
Точно помню была статья на хабре, уже все перерыл не могу найти.
  • Вопрос задан
  • 2287 просмотров
Подписаться 5 Оценить Комментировать
Решения вопроса 1
DevMan
@DevMan
SELECT table1.`id`, table1.`title`, GROUP_CONCAT(table2.`name` SEPARATOR ', ') as names 
FROM `table1` JOIN table2 ON table1.`id` = table2.`sourceid` 
GROUP BY table2.`sourceid`
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
alexxxst
@alexxxst
Как-то так:
SELECT t1.*, GROUP_CONCAT(t2.name) FROM t1 JOIN t2 ON(t1.id = t2.sourceid) WHERE t1.id = 1 GROUP BY t2.sourceid
Не проверял :)
Ответ написан
Сразу предупреждаю, я не гуру по базам и вообще такие вопросы лучше задавать на профильных ресурсах, например, на sql.ru.

Есть вложенные запросы, погуглите. Но, по-моему, особого прироста это не даст, они нужны просто для того, что бы перенести логику из приложения в запрос. То есть, по производительности, равносильно тому, что вы загрузите данные из первой таблицы, а затем циклом из второй.

В общем, если бы производительность была очень важна, я бы делал так:
1) если предполагаемый массив данных небольшой, то выбирал бы одним запросом
2) если большой, то двумя, второй по списку id, так как может кушать много памяти

Обработал бы полученные данные и привел бы к требуемому виду уже непосредственно в приложении.
Ответ написан
Комментировать
Нагуглил вот это: webi.ru/webi_articles/8_14_f.html

Похоже, это то, что вы искали. Но, мне кажется, это костыль, вряд ли будет всегда или хотя бы иногда работать быстрее.
Ответ написан
Комментировать
winbackgo
@winbackgo Автор вопроса
GROUP_CONCAT в принципе выполняет поставленную задачу. Но была тут темка и что-то там было особенное. Спасибо всем за ответы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы