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

标签 mysql sql database

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

最佳答案

对于像 newsnews_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/

相关文章:

php - 如何将印度标准时间转换为用户时区

mysql - 如果不在另一个表中,则仅从一个表中选择用户

mysql - 如何更新mysql中的一行并插入新记录?

java - 如何在 Ruby 程序中捕获 java.sql.sqlException?

mysql - FOR ALL/EXIST 查询

mysql - 是否有示例 MySQL 数据库?

ruby-on-rails - 数据库更改是否可以触发 Rails 中的方法调用?

java - 在我的 Elasticsearch 查询中将逗号放在哪里

php - 在php中只获取最后一个id

mysql - 我可以从 mysql 5.5 打开 mysql 5.1 数据库吗?