【问题标题】:Mysql: Get data from multiple tablesMysql:从多个表中获取数据
【发布时间】:2017-12-08 16:52:26
【问题描述】:

我有 4 张桌子。

帖子:id、标题

标签:id、名称

post_tag:id、post_id、tag_id

user_read_activity:id、user_id、post_id

User_read_activity 包含用户已阅读的帖子。 Post_tag 包含链接到标签的帖子。一篇文章可以有多个标签。我需要根据用户关注的某些标签来获取用户未读的帖子,并删除用户可能不喜欢的某些帖子。

我想出了这段代码。但这是错误的。这也给了我用户阅读的帖子。但基于标签,这些是正确的。只需要更正未读的部分。请帮我解决这个问题。

如果代码有任何错误,也请帮助我更正代码。

SELECT DISTINCT post.* FROM post 

INNER JOIN post_tag ON post.id = post_tag.post_id 

INNER JOIN tag 

WHERE tag.id = 21 OR tag.id = 26 OR tag.id = 63 OR tag.id = 86 OR tag.id = 11 

AND post.id != 1088 AND post.id != 338 AND post.id != 1396 

AND post.id NOT IN (SELECT post_id from user_read_activity WHERE user_id = 70)  

ORDER BY post.likes DESC LIMIT 5

【问题讨论】:

  • 为什么不使用 IN 作为标签 ID?像这样:WHERE tag.id IN (21,26,63,86,11)
  • 在没有任何聚合函数的情况下,GROUP BY 子句充其量是误导性的,最坏的情况是错误的。
  • @Strawberry 我重复了相同的帖子。这就是为什么我添加了 GROUP BY
  • @SalluSalman 错误未使用Group by 进行聚合。您应该(在某些数据库中,必须)指定您希望 MySQL 如何处理任何冲突...使用 MAXMIN 等函数。
  • DISTINCT 将返回一组“正确”的不同结果。

标签: mysql


【解决方案1】:

你只需要在你的条件周围加上括号来明确优先顺序。您还应该在 post_tag 和 tag 之间进行适当的连接:

SELECT DISTINCT post.* FROM post 

INNER JOIN post_tag ON post.id = post_tag.post_id 

INNER JOIN tag ON post_tag.tag_id = tag.id

WHERE (tag.id = 21 OR tag.id = 26 OR tag.id = 63 OR tag.id = 86 OR tag.id = 11)

AND post.id != 1088 AND post.id != 338 AND post.id != 1396 

AND post.id NOT IN (SELECT post_id from user_read_activity WHERE user_id = 70) 

ORDER BY post.likes DESC LIMIT 5

或者@dimwittedanimal 建议的IN 标准也可以。

SELECT DISTINCT post.* FROM post 

INNER JOIN post_tag ON post.id = post_tag.post_id 

INNER JOIN tag ON post_tag.tag_id = tag.id

WHERE tag.id IN (21, 26, 63, 86, 11)

AND post.id NOT IN (1088, 338, 1396)

AND post.id NOT IN (SELECT post_id from user_read_activity WHERE user_id = 70) 

ORDER BY post.likes DESC LIMIT 5

【讨论】:

  • 如果我添加 tag.id IN () 它将如何知道内部是 AND 还是 OR? tag.id 是 OR,post.id 是 AND。请检查我的问题中的查询
  • @SalluSalman,提供的答案是否给您正确的结果?它回答了你的问题吗?如果没有,请提供一些示例数据和预期的输出数据。
  • IN 如果字段值匹配任何指定值(即匹配第一个值或第二个值等),则返回 true。 NOT IN 如果字段值不匹配任何指定值(不匹配第一个值,也不匹配第二个值等),则返回 true。
  • @cf_en 谢谢。我使用了您的代码并返回了一组不同的代码。将验证并更新其结果是否正确
  • @SalluSalman 我进行了编辑以解决tag 表上的连接问题。您应该使用编辑后的版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-28
相关资源
最近更新 更多