Subquery mit mehreren Ergebnissen in ein einziges Feld kombiniert?
-
27-09-2019 - |
Frage
Angenommen ich diese Tabellen haben, von dem ich in einem Browser-Anzeige Suchergebnisse müssen:
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
Ich brauche Ausgabe, dass sieht wie folgt aus:
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
Der wichtige Teil ist, dass jeder Elementtyp wird nur einen Datensatz / Zeile in der Rückkehr auf dem Bildschirm. Ich erreichte dies in der Vergangenheit durch mehrere Zeilen des gleichen Elements zurückkehren und mit einer Skriptsprache der Ausgabe zu begrenzen. Allerdings macht dies die ui übermäßig kompliziert und verworren. Also, ich hoffe, dass ich die Datenbank bekommen können nur so viele Datensätze auszuspucken wie es Zeilen angezeigt werden soll.
In diesem Beispiel kann ein bisschen extrem, weil die 2 Joins aus dem Artikel zu dem Behälter erhalten benötigt wird (durch den Verkauf Tabelle).
würde ich für nur ein Beispiel Abfrage glücklich sein, gibt diese:
itemid itemname saleids saledates
1 Barbie Doll 1,2 20100101,20100102
2 Coin 3,4 20091201,20091115
3 Pop-Top 4 20091115
Ich kann nur ein einziges Ergebnis in einer Unterabfrage zurückgeben, also bin ich nicht sicher, wie dies zu tun.
Lösung
Angenommen, Sie MySQL verwenden (die vier Fragen, die Sie haben, nur eine ist als MySQL markiert), die GROUP_CONCAT Funktion ist, was Sie nach:
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
Wenn Sie Einzelteile möchten, die nicht haben könnten Links zu den Verkaufs- und / oder Container-Tabellen -. Add „LEFT“ vor dem „JOIN“