从数据库中获取新闻项的文件路径的最佳解决方案是什么?

时间:2012-04-08 23:11:37

标签: mysql sql database

我有两个表:newsnews_filesnews表包含newsId和其他一些列,news_files包含newsIdfilePath。对于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

2 个答案:

答案 0 :(得分:1)

对于newsnews_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_filesGROUP_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)

不是最优雅的,但如果你需要快速又脏的东西,它应该有效!