Subconsulta con múltiples resultados combinados en un solo campo?
-
27-09-2019 - |
Pregunta
Supongamos que tengo estas tablas, a partir del cual debo mostrar resultados de búsqueda en un navegador:
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
Necesito salida que es similar al siguiente:
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
La parte importante es que cada tipo de elemento sólo se pone un registro / fila de la rentabilidad de la pantalla. He logrado esto en el pasado mediante la devolución de varias filas de un mismo artículo y el uso de un lenguaje de script para limitar la salida. Sin embargo, esto hace que la interfaz de usuario excesivamente complicado y descabellado. Por lo tanto, estoy esperando que pueda obtener la base de datos de escupir solamente tantos registros como hay filas para mostrar.
Este ejemplo puede ser un poco extremo debido a la 2 se une necesario para llegar al contenedor desde el punto (a través de la mesa de la venta).
Yo estaría feliz por sólo una consulta de ejemplo que da salida a esto:
itemid itemname saleids saledates
1 Barbie Doll 1,2 20100101,20100102
2 Coin 3,4 20091201,20091115
3 Pop-Top 4 20091115
I sólo puede devolver un único resultado en una subconsulta, así que no estoy seguro de cómo hacer esto.
Solución
Si se asume que está utilizando MySQL (una de las cuatro preguntas que tenga, sólo uno está etiquetado como MySQL), la función GROUP_CONCAT es lo que se busca es:
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
Si desea que los elementos que podrían no tener enlaces a las ventas y / o contenedores tablas -. Add "LEFT" frente a la "JOIN"