news
のような1対多の関係の場合news_files
、それらすべてを1つのクエリにまとめるには、ご存知のとおり、「多」テーブルの関連する行ごとに「1」から重複する列値を取得する必要があります。
ただし、これを1つのクエリで実行する必要があるかどうかは疑問です。news_files
1対1の関係の場合、行ごとに1つの行しかない場合はnews
、1つのクエリでそれらを生成しようとするのが理にかなっています。ただし、1対多の場合は、メインテーブルをクエリしてから、「多くの」関係テーブルから関連する行をクエリすることもできます。
/* 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
ただし、を使用して1つの列をnews_files
カンマ区切りのリストとして取得できますGROUP_CONCAT()
が、これはすべての行を取得することとまったく同じではありません。MySQLでは、に表示されていない列をGROUP BY
リストに含めることができますがSELECT
、他のRDBMSでは許可されていないため、移植性のために、GROUP_CONCAT()
はサブクエリに配置され、メインテーブルに対して結合してすべての列を取得します。
/* 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