【问题标题】:MYSQL one to many JOINMYSQL 一对多 JOIN
【发布时间】:2009-04-12 05:34:33
【问题描述】:

我有这个查询,我需要在名为“likes”的表中包含另一个联接,其中up​​dates.id = likes.update_id。此连接将有 0 个或更多匹配项。

"SELECT * FROM users 
INNER JOIN updates ON users.remote_id=updates.owner_id 
ORDER BY updates.status_time DESC LIMIT 50"

这可能相当简单,但我无法找到此类查询的任何示例。

情况基本上是我正在显示一个项目列表。我在 users 表上进行连接以获取创建每个项目的用户。我还需要在“喜欢”表上进行连接,以显示喜欢每个项目的 0+ 人。


编辑:我的解决方案

好的,这里是使用 GROUP_CONCAT 成功加入和组合重复结果(因为每次更新都有多个“喜欢”)。

"SELECT   users.*,updates.update_id,updates.content,updates.status_time,
GROUP_CONCAT(likes.liker SEPARATOR ',') AS liked_by 
FROM updates 
LEFT OUTER JOIN likes ON updates.update_id = likes.update_id 
JOIN users ON users.remote_id = updates.owner_id 
GROUP BY updates.update_id 
ORDER BY updates.status_time DESC 
LIMIT 200"

【问题讨论】:

  • 您声称是按updates.time 排序的,但结果中没有“时间”字段 - 是什么?
  • 另外,拥有三个表中每一个的完整列列表会很有帮助。如果有一个 users.id 列和一个 updates.id 列,您可能只会看到 users.id,即使连接是在 updates.id 上(非唯一列名的主要问题之一)。跨度>
  • 是的,非唯一的列名引起了我的困惑。我想通了,并用解决方案更新了原始帖子。谢谢!

标签: sql mysql


【解决方案1】:
SELECT * FROM users 
LEFT OUTER JOIN updates ON users.remote_id=updates.owner_id
INNER JOIN likes ON <join condition here>
ORDER BY updates.time DESC LIMIT 50

这行得通吗?

如果不是,您能否澄清您的问题到底是什么?难道你的查询没有用?

【讨论】:

  • 如果有零个或多个匹配,请考虑“LEFT OUTER JOIN”。
  • 啊。那么,这更有意义。
  • mysql 中的左连接始终是外连接,而仅连接始终是内连接。无需使用“外部”或“内部”iirc。
  • 不需要,但它使行为更加明确。
【解决方案2】:

如果你有一个 1 到 n 的关系,你应该使用 LEFT JOIN ,我的意思是如果只有 1 个用户和许多 likes.user_id 你应该用以下方式做

“SELECT * FROM users LEFT JOIN updates ON (users.remote_id=updates.owner_id) ORDER BY updates.time DESC LIMIT 50”

这样您就可以从某个用户那里获得所有更新:)

干杯

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 2011-05-29
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多