2017-05-24 3 views
0

Ich kodiere eine Website und möchte eine Zeitleiste erstellen, die die Aktivität eines Benutzers zeigt: Kommentare, die er geschrieben hat (über Artikel in der Site), Nachrichten, die er gepostet hat (auf der Foren) und [up | down] Stimmen, die er abgegeben hat.Tabellen mit verschiedenen Spalten zu einer einzigen Abfrage zusammenfügen

Im Moment habe ich drei Tabellen (nicht-relevanten Felder übersprungen):

COMMENTS 
id | author_id | article_id | timestamp 

MESSAGES 
id | author_id | thread_id | timestamp 

VOTES 
id | author_id | comment_id | message_id | type | timestamp 

Ich möchte eine Abfrage auszuführen, die bei einem gegebenen author_id wird ein Ergebnis Kombinieren des article_id Feld von KOMMENTAR zurückzukehren, die thread_id von MESSAGES, die comment_id, message_id und type Felder von VOTES und der gemeinsamen timestamp Feld, alle nach dem Zeitstempel sortiert. Das Ergebnis sollte wie folgt sein:

article_id | thread_id | comment_id | message_id | type | timestamp 

Ich bin mit PostgreSQL, und bisher habe ich es nicht gelungen, diese Art von Ergebnis zu erzeugen.

Kann mir jemand in die richtige Richtung zeigen?

EDIT

Um zu klären, was ich erreichen will, wenn ich die folgenden Daten in der Datenbank hatte:

COMMENTS 
id | author_id | article_id | timestamp 
1 |   1 |   1 | 11:00:10 
2 |   1 |   2 | 11:00:20 

MESSAGES 
id | author_id | thread_id | timestamp 
3 |   1 |  20 | 12:00:10 
4 |   1 |  21 | 12:00:20 

VOTES 
id | author_id | comment_id | message_id | type | timestamp 
5 |   1 |   1 |   | 1 | 13:00:10 
6 |   1 |   |   3 | 2 | 13:00:20 

Dann sollte das Ergebnis sein:

article_id | thread_id | comment_id | message_id | type | timestamp 
     1 |   |   |   |  | 11:00:10 
     2 |   |   |   |  | 11:00:20 
      |  20 |   |   |  | 12:00:10 
      |  21 |   |   |  | 12:00:20 
      |   |   1 |   | 1 | 13:00:10 
      |   |   |   3 | 2 | 13:00:20 

Danke im Voraus.

+0

Welchen der drei Zeitstempel möchten Sie auswählen oder möchten Sie alle? –

+0

@TimBiegeleisen: Ich brauche sie alle, um die Zeitleiste des Benutzers zu erstellen. Ich habe den ursprünglichen Beitrag aktualisiert, um zu illustrieren, was ich erreichen möchte. –

Antwort

1

Ich habe keine Ahnung, warum Sie diese Ausgabe benötigen, aber Sie können die folgende Union-Abfrage versuchen:

SELECT 
    article_id, NULL, NULL, NULL, NULL, timestamp 
FROM COMMENTS 
WHERE author_id = 1 
UNION ALL 
SELECT 
    NULL, thread_id, NULL, NULL, NULL, timestamp 
FROM MESSAGES 
WHERE author_id = 1 
UNION ALL 
SELECT 
    NULL, NULL, comment_id, message_id, type, timestamp 
FROM VOTES 
WHERE author_id = 1 
ORDER BY timestamp 
+0

Dies erzeugt zwar eine vollständige Ergebnismenge, enthält jedoch nicht die gemeinsame Spalte "Zeitstempel". –

+0

@JaviLavandeira Sorry, ich habe diese Spalte verpasst. –

0

SOlution

select c.author_id ,article_id, thread_id , comment_id, message_id, type, c.timestamp 
    FROM COMMENTS c 
    LEFT JOIN MESSAGES m 
     ON c.author_id = m.author_id and c.timestamp = m.timestamp 
    LEFT JOIN VOTES v 
     ON c.author_id = v.author_id and c.timestamp = v.timestamp 
    where [email protected]_id 

wenn Zeitstempel dann nicht gleich ist versuchen, diese

select c.author_id ,article_id, thread_id , comment_id, message_id, type, isnull(isnull(c.timestamp,m.timestamp),v.timestamp) as timestamp 
    FROM COMMENTS c 
    full JOIN MESSAGES m 
     ON c.author_id = m.author_id 
    full JOIN VOTES v 
     ON c.author_id = v.author_id 
    where [email protected]_id 
+0

Hallo Ravi. Ich denke nicht, dass das funktionieren wird, weil die Zeitstempel niemals gleich sein werden. –

+0

Verwenden Sie den vollständigen Join anstelle des linken Joins und entfernen Sie die Überprüfung des Timestamps bei Joins und verwenden Sie auch isnull (isnull (c.timestamp, m.timestamp), v.timestamp) anstelle von c.timestamp in select-Anweisung, denke ich help you – Ravi

+0

Wie ist es anders als die Antwort bereits zur Verfügung gestellt, abgesehen davon, dass es falsch ist – Hexxx

Verwandte Themen