如何将mysql连接查询中的where子句应用于不同的表

时间:2015-01-19 18:59:09

标签: mysql sql

我有以下基于Mysql intersection based on single field的mysql语句:

SELECT 
  m1.* 
FROM
  mytable m1 
  INNER JOIN mytable2 m2 
    ON m1.history = m2.history 
WHERE `insert_date` >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)

where子句是否适用于第一个表。如何将where子句应用于第二个表或第一个表?

编辑:我实际上要做的是执行:

SELECT *
FROM `mytable1`
WHERE `insert_date` >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)

然后获取mytable2(m2)的内部联接记录:

ON m1.history = m2.history

我的原始查询可能是正确的,但我不确定。

这让我开始思考:如果我想将条件应用于其中一个或两个表的连接,该怎么办?我不确定如何构建该查询。

3 个答案:

答案 0 :(得分:2)

mysql将为您处理,您可以将where表中的列中的列放入。可以将连接视为生成一个包含其中两个表的列的新表,然后将where子句应用于该结果集。如果两个表中都有相同的列,则只需在表壳中提供表或别名的名称即可获得该列。实际上,如果是这种情况,您的查询将无法编译:除非您这样做:

SELECT 
  m1.* 
FROM
  mytable m1 
  INNER JOIN mytable2 m2 
    ON m1.history = m2.history 
WHERE m2.`insert_date` >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)

答案 1 :(得分:1)

我相信你可以将条件添加到ON子句或WHERE子句。但是,每the documentation个ON条件(理想情况下)用于描述表的连接方式,而WHERE条件用于其他所有条件。不过,我对MySQL还是比较陌生的,所以我可能会遗漏一些东西。

如,

SELECT 
  m1.* 
FROM
  mytable m1 
  INNER JOIN mytable2 m2 
    ON m1.history = m2.history 
WHERE 
    `insert_date` >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)
    AND
    m2.id > 1

答案 2 :(得分:1)

您可以使用该SQL语句中表的where子句中的任何列。在INNER JOIN中使用USING AND或ON子句的WHERE子句中。

SELECT m1.* 
FROM mytable m1 
  INNER JOIN mytable2 m2 ON m1.history = m2.history 
             AND m2.YourColumnnameHereFromSecondTable = anyvalue <<<----- HERE
WHERE m1.insert_date >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)
      AND m2.YourColumnnameHereFromSecondTable = anyvalue        <<<----- HERE

REFER HEREHEREHERE