2017-05-18 7 views
0

Also habe ich mit Joins gespielt und versucht, den besten Weg zu finden, dies zu erreichen.PostgreSQL - Alle Zeilen aus verknüpften Tabellen einschließen

Sagen wir, ich habe diese Tabellen. Aus Gründen der Kürze nicht alle Spalten setzen. Aber Tabelle A hat mehrere Spalten als B.

   Table A 
      --------- 
| id | member_id | data | updated 

Dann diese Tabelle

   Table B 
      --------- 
| id | post_id | member_id | post_date 

Tabelle B.post_id ist ein Fremdschlüssel zu Table A.id

Ich möchte Tabelle A und B verbinden, aber das Rück alle Reihen. Im Moment kann ich nur alle Zeilen von Tabelle A und nur übereinstimmende von Tabelle b zurückgeben. Ich brauche die Zeilen-Tabelle B, die sowohl von Tabelle A als auch von ORDER BY DESC der größten der 2 Zeitspalten abgeglichen wurde.

Hier ist die Abfrage, die ich mir die gewünschten Ergebnisse nicht bekommen mit

SELECT a.*, b.member_id as poster, b.post_date, c.title, c.level 
    FROM tableA as a LEFT JOIN tableC as c ON c.a_id=a.a_id 
    LEFT JOIN tableB as b ON a.id=b.post_id 
    WHERE a.member_id IN (100,101) OR b.member_id IN (100,101) 
    ORDER BY GREATEST(a.updated,b.post_date) DESC LIMIT 10 

gespielt habe. Wenn ich eine Zeile mit ID 20 aus Tabelle A habe, die Join in Tabelle b übereinstimmt, bekomme ich nur die Zeile aus Tabelle b in den Ergebnissen und nicht beide Zeilen aus beiden Tabellen. Ich habe mit vielen Möglichkeiten gespielt und andere Antworten auf SO versucht, einfach nicht ausgearbeitet. Die Abfrage sollte mit vielen Datensätzen gut funktionieren. Wenn jemand einen besseren und leistungsfähigeren Weg hat, dies zu tun und es zum Laufen zu bringen, bitte teilen. Hier

ist Beispieldaten:

Tabelle A

id | member_id | data | updated 
--- ------- --------- --------- 
10 | 101  | data | 1495081193 
11 | 100  | data | 1495081500 
12 | 101  | data | 1495081600 

Tabelle B

id post_id | member_id | post_date 
--- ------- --------- --------- 
2 | 10 | 101  | 1495083000 
3 | 10 | 100  | 1495083500 

Also, was ich für Ergebnisse zu erwarten auf dem Join ist

id post_id | member_id | data | post_date | updated 
--- ------- --------- ------ ---------  ------- 
3 | 10 | 100  | data | 1495083500 | 1495081193 
2 | 10 | 101  | data | 1495083000 | 1495081193 
12 |  | 101  | data |    | 1495081600 
11 |  | 100  | data |    | 1495081500 
10 |  | 101  | data |    | 1495081193 

Aber ich bekomme nur th ist ohne die Spalte, die als letzte übereinstimmte.

id post_id | member_id | data | post_date | updated 
--- ------- --------- ------ ---------  ------- 
3 | 10 | 100  | data | 1495083500 | 1495081193 
2 | 10 | 101  | data | 1495083000 | 1495081193 
12 |  | 101  | data |    | 1495081600 
11 |  | 100  | data |    | 1495081500 

dass ein grobe Beispiel ist zu beachten, ich befehle von GREATEST die Zeitstempel der beiden Spalte zu verwenden.

+2

I don versteh es nicht. Bitte zeigen Sie einige Beispieldaten für A, für B, das Ergebnis, das Sie erhalten, und das Ergebnis, das Sie erwarten. –

+0

@ThorstenKettner Ich habe die Frage aktualisiert. –

Antwort

1

Dies ist ein sehr seltsames Abfrageergebnis. Schließlich ist es zwei Abfragen kombiniert:

  • bekommen A alle Datensätze
  • alle B Aufzeichnungen erhalten mit verbunden, um eine Daten

Die Abfrage ist daher eine Union-Abfrage:

selectid b.id, b.post_id, b.member_id, a.data, b.post_date, a.updated 
from b 
join a on a.id = b.post_id 
union all 
select id a.id, null, a.member_id, a.data, null, a.updated 
from a 
order by greatest(updated, coalesce(post_date, updated)) desc; 
+0

Dies gab die Richtung, die ich brauchte, mit Union, diese und eine andere Post half mir bei der Lösung. Vielen Dank –

Verwandte Themen