【问题标题】:Left Join the same table based on two different fields?Left 根据两个不同的字段加入同一个表?
【发布时间】:2014-08-23 06:56:37
【问题描述】:

我有两张桌子...

SELECT * FROM posts  
post_id | user_id | timestamp | feed_id | content

SELECT * FROM users  
user_id | username | display_name

我有以下 MySQL 查询来获取帖子并 LEFT JOIN 发布它的相应用户信息...然后按发布的时间戳对帖子进行排序。

SELECT posts.*, users.* FROM `posts` LEFT JOIN `users` ON posts.user_id=users.user_id ORDER BY `timestamp` DESC LIMIT 0, 15

现在,posts.feed_id 要么为 NULL,即“普通帖子”,但也可以是另一个 user_id,即针对该用户的帖子。

我如何添加另一个 JOIN 语句来获取该用户信息(如果可用) --- 在 posts.feed_id=users.user_id

类似的东西(但不是这个,这没有得到我想要的):

SELECT posts.*, users.* FROM `posts` LEFT JOIN `users` ON posts.user_id=users.user_id AND posts.feed_id=users.user_id ORDER BY `timestamp` DESC LIMIT 0, 15

我确定我必须相应地为信息设置别名,但我似乎根本无法检索它

【问题讨论】:

  • 您必须加入users 表两次。一次用于user_id,一次用于feed_id。在这种情况下它会起作用:)
  • 好问题。有时我们会被困在一个关系迷宫中,门正对着我们。赞成:)

标签: mysql left-join


【解决方案1】:

使用不同的别名加入两次:

SELECT posts.*, source.*, target.*
FROM `posts` 
LEFT JOIN `users` as source ON posts.user_id=source.user_id
LEFT JOIN `users` as target on posts.feed_id=target.user_id
ORDER BY `timestamp` DESC LIMIT 0, 15

您可能希望明确列出列而不是 source.*target.*,以便为它们指定不同的名称。

【讨论】:

  • 我确实列出了它们,但为我的问题缩短了它(所以你不必对所有这些进行排序!)谢谢! :)
  • @jimgarrison 因为您要从同一个表进行 2 次左连接,所以此语句不需要 SELECT DISTINCT,对吗?顺便说一句,tks 对我的问题的编辑重新查找对数据库中视图的引用。赞成:)
  • 如果有超过 61 个列需要连接 61 个不同的表怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多