2012-04-08 4 views
0

Ich habe zwei Tabellen: news und news_files. Die Tabelle enthält newsId und einige andere Spalten, news_files enthält newsId und filePath. Für einen Datensatz können Sie mindestens 5 Dateien haben.Was ist die beste Lösung, um Dateipfade für eine Nachricht aus der Datenbank zu erhalten?

Was wäre die beste Lösung, um alle Spalten von news und alle Dateien für diesen bestimmten Datensatz in einer einzigen Abfrage ohne Duplikate abzurufen?

Ich habe die folgende Abfrage so weit, aber für jeden news_files gibt es die gleichen news Aufzeichnungen (eine Zeile für jeden filePath mit gleichen news).

select n.* from news n 
left outer join news_files nf on n.Id = nf.newsid 
where n.Id = 1 

Antwort

1

Für eine one to many Beziehung wie news zu news_files, um sie alle in einer Abfrage zu erhalten, die Sie, wie Sie gefunden haben, müssen doppelte Spaltenwerte aus der „Eins“ für jede verwandte Zeile abzurufen in der "viele" Tabelle.

Allerdings stelle ich die Notwendigkeit in Frage, dies in einer einzigen Abfrage zu tun. Für eine Eins-zu-Eins-Beziehung wäre es sinnvoll, wenn nur eine news_files Zeile pro Zeile vorhanden wäre, sie in einer Abfrage zu erstellen. Aber für eine Eins zu viele, können Sie auch nur die Haupttabelle abfragen und dann die verwandten Zeilen aus der Beziehungstabelle "viele" abfragen. jedoch

/* Returns duplicate column values for each news_files row */ 
/* and all columns from both tables */ 
SELECT 
    n.*, 
    nf.* 
FROM 
    news n 
    LEFT OUTER JOIN news_files nf ON n.Id = nf.newsid 
WHERE n.Id = 1 

Sie können eine Spalte von news_files als durch Kommata getrennte Liste abrufen GROUP_CONCAT() verwenden, aber das ist nicht genau das gleiche wie nur alle Zeilen abruft. Obwohl MySQL erlaubt, dass Spalten, die nicht in GROUP BY erscheinen, in der SELECT Liste vorhanden sind, gibt es andere RDBMS nicht. Daher wird der Port GROUP_CONCAT() in eine Unterabfrage gestellt, um der Haupttabelle beizutreten und alle Spalten abzurufen.

/* Comma-separated list of filePath and all cols from news */ 
SELECT 
    n.*, 
    nf.files 
FROM 
    news 
    LEFT OUTER JOIN (
    SELECT newsid, GROUP_CONCAT(filePath) AS files FROM news_feeds 
    GROUP BY newsid 
) nf ON n.Id = nf.newsid 
+0

danke, zweite Lösung (Group_Concat) löste mein Problem – user217648

0

Dies ist vorausgesetzt, Sie haben 2 Spalten in Nachrichten und 2 Spalten in news_files ... Pad mit null, aber Sie brauchen sie.

Nicht die eleganteste, aber sollte funktionieren, wenn Sie etwas schnell und schmutzig brauchen!

Verwandte Themen