对于一对多的关系,news
喜欢news_files
,为了将它们全部放入一个查询中,正如您所发现的,您需要为“many”表中的每个相关行从“one”中检索重复的列值。
但是,我质疑是否需要在单个查询中执行此操作。news_files
对于一对一的关系,如果每行只有news
一行,那么尝试在一个查询中生成它们是有意义的。但是对于一对多,您不妨只查询主表,然后从“多”关系表中查询相关行。
/* 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
但是,您可以使用逗号分隔的列表从列表中检索一列,但这与仅检索所有行并不完全相同。虽然 MySQL 允许未出现在列表中的列存在,但其他 RDBMS 不允许,因此为了可移植性,将其放置在子查询中以连接主表并检索所有列。news_files
GROUP_CONCAT()
GROUP BY
SELECT
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