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.

¿Fue útil?

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"

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top