0

我有两张桌子:newsnews_files。该news表包含newsId和其他一些列,news_files包含newsIdfilePath。作为news记录,您至少可以拥有 5 个文件。

在一个查询中检索此特定记录的所有列news和所有文件而不重复的最佳解决方案是什么?news

到目前为止,我有以下查询,但是对于每个news_files它都返回相同的记录(每个记录相同的news一行)。filePathnews

select n.* from news n 
left outer join news_files nf on n.Id = nf.newsid 
where n.Id = 1
4

2 回答 2

1

对于一对多的关系,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_filesGROUP_CONCAT()GROUP BYSELECTGROUP_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
于 2012-04-08T23:46:48.257 回答
0

这是假设您在 news 中有 2 列,在 news_files 中有 2 列...用 null 填充,但是您需要它们。

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)

不是最优雅的,但如果你需要一些快速和肮脏的东西,应该可以工作!

于 2012-04-09T03:33:40.287 回答