Подзапрос с несколькими результатами в сочетании в одно поле?
-
27-09-2019 - |
Вопрос
Предположим, у меня есть эти таблицы, из которых мне нужно отобразить результаты поиска в браузере:
Table: Containers
id | name
1 Big Box
2 Grocery Bag
3 Envelope
4 Zip Lock
Table: Sale
id | date | containerid
1 20100101 1
2 20100102 2
3 20091201 3
4 20091115 4
Table: Items
id | name | saleid
1 Barbie Doll 1
2 Coin 3
3 Pop-Top 4
4 Barbie Doll 2
5 Coin 4
Мне нужен выход, который выглядит так:
itemid itemname saleids saledates containerids containertypes
1 Barbie Doll 1,2 20100101,20100102 1,2 Big Box, Grocery Bag
2 Coin 3,4 20091201,20091115 3,4 Envelope, Zip Lock
3 Pop-Top 4 20091115 4 Zip Lock
Важная часть заключается в том, что каждый тип элемента получает только одну запись / строку в возврате на экран. Я достиг этого в прошлом, вернув несколько строк одного и того же элемента и используя язык сценариев для ограничения вывода. Однако это делает пользовательский интерфейс чрезмерно сложным и тянет. Итак, я надеюсь, что могу получить базу данных, чтобы выплюнуть только столько записей, так как для отображения есть строки.
Этот пример может быть немного экстремальным из-за 2 соединений, необходимых для доступа к контейнеру от элемента (через таблицу продажи).
Я был бы счастлив только за пример запроса, который выводит это:
itemid itemname saleids saledates
1 Barbie Doll 1,2 20100101,20100102
2 Coin 3,4 20091201,20091115
3 Pop-Top 4 20091115
Я могу вернуть только один результат в подзапросе, поэтому я не уверен, как это сделать.
Решение
Предполагая, что вы используете MySQL (из четырех вопросов, которые у вас есть, только один помечен как MySQL), Функция group_concat. это то, что вы после:
SELECT i.name AS itemname,
GROUP_CONCAT(s.id ORDER BY s.id) AS salesids,
GROUP_CONCAT(s.date ORDER BY s.date) AS salesdates,
GROUP_CONCAT(s.containerid ORDER BY s.containerid) AS containerids,
GROUP_CONCAT(c.name ORDER BY c.name) AS containertypes
FROM ITEMS i
JOIN SALE s ON s.id = i.salesid
JOIN CONTAINERS c ON c.id = s.containerid
GROUP BY i.name
Если вы хотите предметы, которые могут не иметь ссылок на таблицы продаж и / или контейнеров - добавьте «слева» перед «присоединением».