【问题标题】:WHERE clause before INNER JOININNER JOIN 之前的 WHERE 子句
【发布时间】:2012-04-25 09:02:03
【问题描述】:

如果我有

SELECT * FROM Table1 t1 
LEFT JOIN Table2 t2 ON t1.id = t2.id 
WHERE t1.user='bob';

WHERE 子句是否在两个表为JOINED 之后运行?

如何让它在 JOIN 之前运行?

【问题讨论】:

  • 给出的答案是正确的,但值得深入研究。你为什么要寻找这种行为?我想查询优化器会为你处理明显的情况......

标签: mysql join optimization where


【解决方案1】:

WHERE 更改为另一个JOIN 条件

LEFT JOIN Table2 t2 on t1.id = t2.id AND t1.user='bob'

【讨论】:

    【解决方案2】:

    你可以的

    SELECT * 
        FROM Table1 t1 
        LEFT JOIN Table2 t2
            ON t1.id=t2.id AND t1.user='bob';
    

    【讨论】:

      【解决方案3】:

      where 子句将在join 之前执行,这样它就不会加入不必要的记录。所以你的代码是好的。

      【讨论】:

      • @user1124535 我可以确认。运行explain 查询,你会看到。
      • 这是更好的答案。
      【解决方案4】:

      根据我的左连接经验,您不能在 ON 语句中排除“左”(t1) 表中的记录,因为 - 根据定义 - 所有 t1 记录都将包括在内。 where 语句确实有效,因为它将应用于之后的连接结果。

      我不完全知道您想要实现什么,但很可能内部连接也适合您的需求,然后您可以将 t1.user='bob' 条件添加到 ON 语句.

      但如果 Mosty Mostacho 是正确的,则条件的位置(WHERE 与 ON)与执行速度无关。

      【讨论】:

        【解决方案5】:

        RIGHT JOIN 是解决方案:

        SELECT cars.manufacturer, cars.year FROM cars 
        RIGHT JOIN (SELECT m.manufacturer FROM cars AS m ORDER BY m.year DESC LIMIT 3) subq 
        ON cars.manufacturer=subq.manufacturer
        

        还没有经过严格的测试,但似乎有效。

        【讨论】:

          【解决方案6】:

          您应该在其他条件之前将t1.user='bob' 条件添加到ON 子句,它将首先被评估:

          SELECT * FROM Table1 t1 
          LEFT JOIN Table2 t2
          ON t1.user='bob' AND t1.id = t2.id;
          

          【讨论】:

            【解决方案7】:

            你可以使用 FROM 之后的表表达式,如下所示:

            SELECT *
            FROM (SELECT
                    id
                FROM Table1
                WHERE user = 'bob') AS t1
            LEFT JOIN Table2 t2
                ON t1.id = t2.id
            

            【讨论】:

              猜你喜欢
              • 2013-05-14
              • 1970-01-01
              • 2013-08-11
              • 2010-11-04
              • 2011-09-28
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-02-07
              相关资源
              最近更新 更多