Подзапрос с несколькими результатами в сочетании в одно поле?

StackOverflow https://stackoverflow.com/questions/3056081

Вопрос

Предположим, у меня есть эти таблицы, из которых мне нужно отобразить результаты поиска в браузере:

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

Если вы хотите предметы, которые могут не иметь ссылок на таблицы продаж и / или контейнеров - добавьте «слева» перед «присоединением».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top