我有两个表:news
和news_files
。 news
表包含newsId
和其他一些列,news_files
包含newsId
和filePath
。对于news
记录,您可以拥有至少5个文件。
在没有重复的单个查询中,从news
检索所有列以及此特定news
记录的所有文件的最佳解决方案是什么?
到目前为止,我有以下查询,但对于每个news_files
,它会返回相同的news
条记录(每条filePath
有一行news
)。
select n.* from news n
left outer join news_files nf on n.Id = nf.newsid
where n.Id = 1
答案 0 :(得分:1)
对于news
到news_files
之间的一对多关系,为了将它们全部放入一个查询中,您将发现需要从“一个”中检索重复的列值对于“many”表中的每个相关行。
但是,我怀疑是否需要在单个查询中执行此操作。对于一对一关系,如果每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
但是,您可以使用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
答案 1 :(得分:0)
这假设你在新闻中有2列,在news_files中有2列... pad,但是你需要它们。
select n.Id, n.someothercolumn, null as newsId, null as filepath
from news n
where Id = 1
union
select null, null, nf.newsId, nf.filepath
from new_files nf
where newedId = 1
order by isnull(Id, newsId)
不是最优雅的,但如果你需要快速又脏的东西,它应该有效!