当我运行以下查询时,我希望得到一个结果。
但是,我没有结果。
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中是否存在多个值,以便根据需要获得结果。
答案 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_id
是listings
的键,您可以使用HAVING
子句检查逻辑表达式的总和是否大于0
。之所以可行,是因为数字上下文中的逻辑表达式在MySQL中的值为0
或1
。
由于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;