【问题标题】:mysql joins are driving me mad!mysql join 快把我逼疯了!
【发布时间】:2009-07-04 18:00:52
【问题描述】:

所以我问了几个关于执行连接的问题并且得到了很好的答案,但我仍然完全被难住了。

我有 3 张桌子。让我们称它们为 table-b、table-d 和 table-e。
表 b 和表 d 共享一个名为 p-id 的列。
Table-e 和 table-b 共享一个名为 ev-id 的列。
Table-e 也有一个名为 date 的列。
Table-b 还有一个唯一的 id 列,称为 u-id。

我想编写一个在以下条件下返回 u-id 的查询:
1) 限制为table-e.date中的某个值。
2) 其中 table-b.p-id 与 table-d.p-id 不匹配。

我想我需要在 e-id 列上内连接 table-b 和 table-e。然后我认为我需要在 p-id 为空的 table-d 和 table-b 上执行左连接。
我的问题是我不知道编写此查询的语法。我知道如何编写多个内连接,也知道如何编写左连接。如何将两者结合起来?

非常感谢所有帮助我的人。我(显然!)是数据库的新手,并且正在努力解决所有问题!

【问题讨论】:

  • 请发布两个部分查询 - 如果您展示您迄今为止尝试过的内容,这将对我们有所帮助。
  • 你确定条件2吗?例如如果您在表 b 和 d 中的 p-id 为 2、3、4,您希望 b 中的 2 匹配 d 中的 3 和 4,b 中的 3 匹配 d 中的 2 和 4,并且 b 中的 4 匹配 2 和3 在 b?另外,你想让 b 中的 null 匹配 d 中的 null 吗?
  • 我无法发布部分查询,因为我没有为此示例编写它们。我只是说我知道执行连接的通用语法。
  • 我不太关注@Jeremy。我想从 table-d 返回 u-id,但仅限于那些在 table-d 中具有 p-id 而未出现在 table-b 中的记录。这更有意义吗?
  • 啊,对。那是“不在”而不是“左加入”:)

标签: mysql left-join database join


【解决方案1】:

您只需一个接一个地编写连接:

SELECT b.uid
  FROM b
  INNER JOIN e USING(evid)
  LEFT JOIN d USING(pid)
  WHERE e.date = :whatever
    AND d.pid IS NULL

【讨论】:

    【解决方案2】:

    我认为是这样的:

    SELECT uid
      FROM table-b
      INNER JOIN table-e
          ON table-b.ev_id = table-e.ev_id
      WHERE table-b.p_id NOT IN (SELECT p_id from table-d)
    

    【讨论】:

    • 1) 你忘记了 table-e.date=XXX 条件 2) 我发现这比@Alex 的更清楚,但是我相信如果 table-d 有很多行,mysql 会运行得更慢(即使子选择只会运行一次)
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多