MYSQL:AND语句导致不显示预期结果

时间:2019-05-09 12:26:53

标签: mysql

当我运行以下查询时,我希望得到一个结果。

但是,我没有结果。

SELECT listings.*

FROM   `listings` 
       LEFT JOIN users 
              ON listings.user_id = users.user_id 
       LEFT JOIN listing_attributes 
              ON listings.listing_id = listing_attributes.listing_id

WHERE users.account_status = 1

AND ( listing_attributes.name LIKE 'collection_city' AND listing_attributes.content LIKE '%d%' ) 
AND ( listing_attributes.name LIKE 'collection_post_code' AND listing_attributes.content LIKE '%e%' ) 

GROUP BY listings.listing_id

我已经确定问题出在这两行

AND ( listing_attributes.name LIKE 'collection_city' AND listing_attributes.content LIKE '%d%' ) 
AND ( listing_attributes.name LIKE 'collection_post_code' AND listing_attributes.content LIKE '%e%' ) 

如果我删除其中任何一行,我都会得到预期的结果。

我认为()中包含结果的方式出了问题。

从本质上讲,我希望检查在listing_attributes中是否存在多个值,以便根据需要获得结果。

3 个答案:

答案 0 :(得分:2)

我认为您的逻辑不正确。在这种情况下,必须使用运算符OR。否则条件将为false

{

  (  listing_attributes.name LIKE 'collection_city' AND listing_attributes.content LIKE '%d%' ) 
    OR ( listing_attributes.name LIKE 'collection_post_code' AND listing_attributes.content LIKE '%e%' )


}

答案 1 :(得分:0)

鉴于listings.listing_idlistings的键,您可以使用HAVING子句检查逻辑表达式的总和是否大于0。之所以可行,是因为数字上下文中的逻辑表达式在MySQL中的值为01

由于user不能等于WHERE,因此由于NULL,您与1的联接将成为内部联接。由于NULL左联接中的listing_attributes无法使HAVING子句为真,因此您也可以将该联接转换为内部联接。

SELECT listings.*
       FROM listings
            INNER JOIN users
                       ON listings.user_id = users.user_id
            INNER JOIN listing_attributes
                       ON listings.listing_id = listing_attributes.listing_id
       WHERE users.account_status = 1
       GROUP BY listings.listing_id
       HAVING sum(listing_attributes.name LIKE 'collection_city'
                  AND listing_attributes.content LIKE '%d%') > 0
              AND sum(listing_attributes.name LIKE 'collection_post_code'
                      AND listing_attributes.content LIKE '%e%') > 0;

答案 2 :(得分:0)

请使用以下查询,尝试将条件移至on子句

SELECT listings.*
FROM `listings` 
       LEFT JOIN users 
              ON listings.user_id = users.user_id AND users.account_status = 1
       LEFT JOIN listing_attributes 
              ON listings.listing_id = listing_attributes.listing_id AND ( listing_attributes.name LIKE 'collection_city' AND listing_attributes.content LIKE '%d%' ) AND ( listing_attributes.name LIKE 'collection_post_code' AND listing_attributes.content LIKE '%e%' )
GROUP BY listings.listing_id;