我有两个表:news
和 news_files
。 news
表包含 newsId
和其他一些列,news_files
包含 newsId
和 filePath
。对于 news
记录,您至少可以有 5 个文件。
在一个查询中检索 news
中的所有列以及此特定 news
记录的所有文件且不重复的最佳解决方案是什么?
到目前为止,我有以下查询,但对于每个 news_files
它返回相同的 news
记录(每个 filePath
具有相同的行新闻
)。
select n.* from news n
left outer join news_files nf on n.Id = nf.newsid
where n.Id = 1
最佳答案
对于像 news
到 news_files
这样的一对多关系,为了将它们全部放入一个查询中,正如您所发现的,您需要检索重复的列“多”表中每个相关行的“一”值。
但是,我质疑是否需要在单个查询中执行此操作。对于一对一关系,如果每news
行只有一个news_files
行,则尝试在一个查询中生成它们是有意义的。但对于一对多,您不妨只查询主表,然后从“多”关系表中查询相关行。
/* 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
但是,您可以使用 GROUP_CONCAT()
从 news_files
中以逗号分隔列表的形式检索一个列,但这并不完全正确与检索所有行相同。尽管 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
关于mysql - 从数据库获取新闻项目的文件路径的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10067316/