2016-04-19 16 views
2

Meine Datenbank verfügt über mehrere Gruppen, die Ereignisse an einem oder mehreren Orten hosten. Meistens ist es nur der eine Ort, aber Gruppen haben manchmal zwei. Um die Dinge einfach zu halten, wird die folgende Datensatz ist klein und imaginäre:Verknüpfen von zwei Tabellen mit Unterabfragen von einem

‚Gruppen‘ Tisch

+--------------+--------------+--------------+ 
| name   | pri_venue_id | alt_venue_id | 
+--------------+--------------+--------------+ 
| Fast Fingers |   3 |   0 | 
| Data Dishers |   4 |   0 | 
| Leet Hacks |   5 |   2 | 
+--------------+--------------+--------------+ 

Tisch ‚Locations‘

+----------+-------------------------+-----------------+ 
| venue_id | name     | location  | 
+----------+-------------------------+-----------------+ 
|  1 | Public Archives   | Querytown  | 
|  2 | Storage Function Centre | Drive Bay  | 
|  3 | Key Convention Centre | Qwertyville  | 
|  4 | Head-spin Mall   | Drive Park  | 
|  5 | Fast Storage Facility | Memory Bay  | 
+----------+-------------------------+-----------------+ 

ich die beiden Tabellen miteinander verbinden möchte eine einzelne Abfrage, sodass das Ergebnis der Abfrage die Gruppe, den Namen und Standort des primären Veranstaltungsorts und den zweiten Veranstaltungsort und den zweiten Standort anzeigt, falls vorhanden. Im Fall, dass es keine zweite/alternative Veranstaltungsort ist, zeigen nur die primäre, dann zwei NULLS, etwa so:

Data Dishers, Head-spin Mall, Drive Park, NULL, NULL 
Fast Fingers, Key Convention Centre, Qwertyville, NULL, NULL 
Leet Hacks, Fast Storage Facility, Memory Bay, Storage Function Centre, Drive Bay 

Bitte beachten Sie, dass die Ergebnismenge nicht durch Komma getrennte muss sein.

Ich habe andere Stackoverflow Fragen gelesen, habe aber noch keine Lösung gefunden. Ich bekomme entweder doppelte Zeilen oder sonst alles außer dem alternativen Ort, der immer NULL anzeigt. Ich bin mir nicht sicher, was am besten zum Gruppieren wäre, da ich das in einer anderen Frage gesehen habe. Auch versucht, eine Union zu verwenden, aber konnte nicht scheinen, es zur Arbeit zu bringen.

Hier ist die nächste Frage, die ich gekommen bin, oben mit:

SELECT 
    DISTINCT groups. NAME, 
    x. NAME, 
    x.location, 
    y. NAME, 
    y.location 
FROM groups 
INNER JOIN (
    SELECT 
     venues.* 
    FROM venues 
    INNER JOIN groups ON venue_id = pri_venue_id 
) AS x, 
groups 
INNER JOIN (
    SELECT 
     venues.* 
    FROM venues 
    LEFT JOIN groups ON venue_id = alt_venue_id 
) AS y 
GROUP BY x.venue_id 
ORDER BY groups. NAME; 

Vielen Dank im Voraus.

+0

Stellt sich heraus, ich nicht Unterabfragen verwenden haben müssen die richtigen Ergebnisse zu erzielen. Die richtige Abfrage war: "SELECT g.name AS g_name, v1.name AS v_name, v1.location, v2.name AS v_name2, v2.location AS location2 FROM Gruppen g INNER JOIN Standorte v1 ON g.pri_venue_id = v1.venue_id LINKS JOIN Veranstaltungsorte v2 ON g.alt_venue_id = v2.venue_id ORDER BY g.name " –

Antwort

1

One INNER und ein LEFT JOIN zusammen mit CONCAT kann den Trick:

SELECT 
    CONCAT_WS(', ', `name`, `name1`, location1, name2, location2) groups 
FROM 
    (
     SELECT 
      g.`name`, 
      v1.`name` name1, 
      v1.location location1, 
      IF(v2.`name` IS NOT NULL, v2.`name`, 'NULL') name2, 
      IF(v2.location IS NOT NULL, v2.location, 'NULL') location2 
     FROM 
      groups g 
     INNER JOIN venues v1 ON v1.venue_id = g.pri_venue_id 
     LEFT JOIN venues v2 ON v2.venue_id = g.alt_venue_id 
     ORDER BY g.pri_venue_id 
    ) x 

Ausgang:

+-----------------------------------------------------------------------------------+ 
| groups                   | 
+-----------------------------------------------------------------------------------+ 
| Fast Fingers, Key Convention Centre, Qwertyville, NULL, NULL      | 
| Data Dishers, Head-spin Mall, Drive Park, NULL, NULL        | 
| Leet Hacks, Fast Storage Facility, Memory Bay, Storage Function Centre, Drive Bay | 
+-----------------------------------------------------------------------------------+ 
3 rows in set 

Sie können 'NULL' Zeichenfolge mit echten NULL ändern, wenn Sie benötigen.

+0

Ausgezeichnet! Ich hätte früher etwas klarer sein sollen, aber ich brauchte den NULL nicht als NULL-String; ein tatsächlicher NULL-Wert ist in Ordnung. –

1

Was Sie brauchen, ist eine innere Verbindung und eine linke Verbindung. Wie so ...

select g.name, v1.name, v1.location, coalesce(v2.name, 'NULL'), coalesce(v2.location, 'NULL') 
from groups g 
inner join venues v1 on (g.pri_venue_id = v1.venue_id) 
left join venues v2 on (g.alt_venue_id = v2.venue_id) 

Die coalesce Funktion grundsätzlich wandelt nur null Werte in den String NULL

+0

Nicht schlecht, da es die meisten Saiten, die ich brauchte, erreicht hat. Dies scheint jedoch den Nebeneffekt zu haben, die Schlüsselnamen "coalesce (v2.name, 'NULL')" und "coalesce (v2.address, 'NULL')" zu jedem Venue-Namen und Adress-Element in der Array zurückgegeben. Ich brauchte auch, dass die Ergebnismenge nach dem Namen der Gruppen sortiert wurde. Es gab auch einen Namenskonflikt zwischen den beiden Namensfeldern, der verhinderte, dass der Gruppenname angezeigt wurde. Dies kann leicht behoben werden, indem man ihnen jeweils einen anderen Alias ​​gibt. –

Verwandte Themen