MYSQL加入多个条件不起作用

时间:2018-09-12 11:29:21

标签: mysql join

我有一个查询,该查询使用具有多个条件的LEFT JOIN来获取数据。但是,当我在条件中使用多个AND子句时,查询不会返回任何数据。

例如:

LEFT JOIN tblName 
  on x.ABC=y.ABC 
 AND x.MNO="AnyValue" 
 AND x.UserId=1 

不返回任何数据。

但是,当我删除最后一个AND子句(即LEFT JOIN tblName on x.ABC=y.ABC AND x.MNO="AnyValue")时,它给我错误的结果。但是,是的,它至少返回了一些数据。

让我知道如何添加多个条件以使查询正常工作。

我想使用上述第一个条件(即LEFT JOIN tblName on x.ABC=y.ABC AND x.MNO="AnyValue" AND x.UserId=1

)获得结果

2 个答案:

答案 0 :(得分:0)

您的AND ...条件必须位于查询的WHERE部分。

答案 1 :(得分:0)

首先,请确保您了解什么是LEFT JOIN。尝试以这种方式思考它。左侧是我按FROM子句的顺序顺序的看法。您从左到右阅读,因此第一张桌子是我一直想要的左侧。右侧(查询中的下一个表)是可选的,但如果存在的话,很好,我有更多详细信息。

因此以人员和订单为例。我要列出所有人。但是如果他们有命令,那就更好了。

select 
      P.LastName,
      O.OrderID,
      O.OrderDate
   from 
      People P
         LEFT JOIN Order O
            on P.PersonID = O.PersonID 

这将做到这一点。向所有人显示,如果他们有订单,那就顺其自然。如果他们有多个订单,则会在所有订单中显示一行。

现在,将条件扩展到下表。可以说我只想显示自2018年以来的订单。那将成为LEFT JOIN“ ON”子句的一部分,因为我只关心需求中的订单部分。

     LEFT JOIN Order O
        on P.PersonID = O.PersonID 
        AND O.OrderDate >= '2018-01-01'

我仍然会吸引所有人员,但是只有订单日期为2018年1月1日之后的订单信息会显示。

现在,如果您只关心只接受过订单并且在2018年以后下订单的人员,那么基本上可以省去LEFT JOIN并成为标准(INNER)JOIN

    JOIN Order O
       on P.PersonID = O.PersonID 
       AND O.OrderDate >= '2018-01-01'

JOIN表示必须在ORDER边表中找到记录

因此,在您的情况下,“ x”和“ y”的别名来自何处。在上下文中完全不清楚,但希望以上说明能帮助您解决查询。如果没有,请更详细地更新它,并阐明您要从中获得什么。