具有多个AND OR WHERE条件的复杂MySQL查询

时间:2013-01-13 03:03:58

标签: mysql

我有一张帮助选择产品的桌子。

我想查询一下我收回的所有记录:

category_id = 'M10' and band_id = '010'
OR
category_id = 'M10' and band_id = '020'

AND

category_id = 'M50' and band_id = '010'
OR
category_id = 'M50' and band_id = '020'

我的查询:

SELECT 
product.entry_id AS entry_id, 
helpme.item_id AS product_id 
FROM inbound_help_me_choose helpme 
LEFT JOIN exp_channel_titles product ON (product.product_id = helpme.item_id) 
WHERE 
helpme.submarket_id = 'NZ' 
AND 
(
(helpme.category_id = 'M10' AND helpme.band_id = '010') 
OR 
(helpme.category_id = 'M10' AND helpme.band_id = '020')
)

在第一个类别上工作正常,但是一旦我添加新的WHERE条件失败:

SELECT 
product.entry_id AS entry_id, 
helpme.item_id AS product_id 
FROM inbound_help_me_choose helpme 
LEFT JOIN exp_channel_titles product ON (product.product_id = helpme.item_id) 
WHERE 
helpme.submarket_id = 'NZ' 
AND 
(
(helpme.category_id = 'M10' AND helpme.band_id = '010') 
OR 
(helpme.category_id = 'M10' AND helpme.band_id = '020')
)
AND
(
(helpme.category_id = 'M50' AND helpme.band_id = '010')
OR 
(helpme.category_id = 'M50' AND helpme.band_id = '020')
OR 
(helpme.category_id = 'M50' AND helpme.band_id = '030')
)

对我来说似乎没关系,所以我完全失去了为什么它不起作用。

4 个答案:

答案 0 :(得分:3)

我认为你需要这个

SELECT 
product.entry_id AS entry_id, 
helpme.item_id AS product_id 
FROM inbound_help_me_choose helpme 
LEFT JOIN exp_channel_titles product ON (product.product_id = helpme.item_id) 
WHERE 
helpme.submarket_id = 'NZ' 
AND 
(
   (helpme.category_id = 'M10' AND helpme.band_id IN ('010','020')) OR 
   (helpme.category_id = 'M50' AND helpme.band_id IN ('010','020','030'))
)

答案 1 :(得分:1)

稍微改变一下你需要的东西:

category_id = 'M10' and band_id = '010' OR category_id = 'M10' and band_id = '020'
AND
category_id = 'M50' and band_id = '010' OR category_id = 'M50' and band_id = '020'

与:

相同
category_id = 'M10' and (band_id = '010' OR band_id = '020')
AND
category_id = 'M50' and (band_id = '010' OR band_id = '020')

与:

相同
category_id = 'M10' and category_id = 'M50'
AND
(band_id = '010' OR band_id = '020') and (band_id = '010' OR band_id = '020')

category_id不能同时为M10M50,因此您无法获得任何结果......

答案 2 :(得分:1)

您在问题中显示的第二个示例查询中的where子句中的条件,即在其where子句中遇到问题的那个条件,永远无法评估为true ...

第一个例子中第一个where子句要求category_id等于M10。

然后在第二个例子中,where子句使用'和'添加另一组语句。问题是这个where子句只需要category_id为M50

的记录

无论逻辑上有任何其他问题,我都可以相当肯定你找不到同时具有M10和M50的category_id的记录。

另一位用户,@ rs。发布了一个带有修改的where子句的查询,该子句符合开头或问题中指定的条件逻辑规则。

答案 3 :(得分:0)

x AND y运算符意味着需要同时满足它适用的xy条件。您只需要使用OR运算符。