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
danke, zweite Lösung (Group_Concat) löste mein Problem – user217648