如何组织这么多AND的查询

时间:2018-11-21 07:26:19

标签: mysql

我的查询如下:

 SELECT SUM(ct_product_store_quantity.quantity) as quantity, `ct_product`.* 
FROM `ct_product`
LEFT JOIN `ct_productLang` ON `ct_product`.`id` = `ct_productLang`.`product_id`
LEFT JOIN `ct_product_store_quantity` ON `ct_product`.`id` = `ct_product_store_quantity`.`product_id` 
LEFT JOIN `ct_product_attribute` as cpa ON ct_product.id=cpa.product_id 
WHERE cpa.attribute_id=10 
AND cpa.attribute_value_id=36 
AND cpa.attribute_id=2 
AND cpa.attribute_value_id=5 
AND cpa.attribute_id=7 
AND cpa.attribute_value_id=31
AND cpa.attribute_id=9 
AND cpa.attribute_value_id=28
AND cpa.attribute_id=8 
AND cpa.attribute_value_id=25 
GROUP BY `ct_product`.`id`
HAVING quantity > 0 
ORDER BY `id` DESC

简单来说-每个AND条件的评估结果为true。如果我一一执行它们就可以了。但是,当我尝试执行上面发布的内容时,则不会返回任何结果。我确信在多个AND条件部分中操作不正确。 ct_product_attribute表:

+--------------------+--------------+------+-----+---------+----------------+
| Field              | Type         | Null | Key | Default | Extra          |
+--------------------+--------------+------+-----+---------+----------------+
| id                 | int(11)      | NO   | PRI | NULL    | auto_increment |
| product_id         | int(11)      | YES  | MUL | NULL    |                |
| attribute_set_id   | int(11)      | YES  | MUL | NULL    |                |
| attribute_id       | int(11)      | YES  | MUL | NULL    |                |
| attribute_value_id | int(11)      | YES  | MUL | NULL    |                |
| value              | varchar(255) | YES  |     | NULL    |                |
+--------------------+--------------+------+-----+---------+----------------+

如果需要,将发布其他表格。只是想不淹没职位。谢谢!

编辑ct_product中,我得到了以下产品(例如):

id
 1
 2
 3

ct_product_attribute中,每个产品可以具有多个attribute-attr.value对。其中一些对是相同的。(将仅显示我需要的列)

id product_id attribute_id attribute_value_id
1       1           1               1 
2       2           1               1
3       1           2               1
4       2           3               1
5       3           1               1
6       3           2               1

我从请求中获得的值是:

attribute_id=1
attribute_value_id=1
attribute_id=2
attribute_value_id=1

现在我只需要检索带有id=1的产品。如果我使用OR,则它将同时检索产品id=1id=2。不知道现在是否变得更加清晰。

3 个答案:

答案 0 :(得分:3)

我非常确定这些ID应该是OR,因为您不能同时拥有所有这些ID。考虑到这一点,您应该可以使用IN。

WHERE cpa.attribute_id IN (10,2,7,9,8) 
AND cpa.attribute_value_id IN (36,5,31,28,25)

答案 1 :(得分:1)

我真的不知道您要完成什么,但是您应该/可以使用WHERE IN,因为每个人都在注释中指出您正在寻找具有多个值的字段...

但是,对于AND问题,您可以/应该使用IN,如下所示:

 SELECT SUM(ct_product_store_quantity.quantity) as quantity, `ct_product`.* 
FROM `ct_product`
LEFT JOIN `ct_productLang` ON `ct_product`.`id` = `ct_productLang`.`product_id`
LEFT JOIN `ct_product_store_quantity` ON `ct_product`.`id` = `ct_product_store_quantity`.`product_id` 
LEFT JOIN `ct_product_attribute` as cpa ON ct_product.id=cpa.product_id 
WHERE cpa.attribute_id IN (10, 2, 7, 9, 8)
AND cpa.attribute_value_id IN (36, 5, 31, 28, 25)
GROUP BY `ct_product`.`id`
HAVING quantity > 0 
ORDER BY `id` DESC

答案 2 :(得分:1)

您可以尝试使用(cpa.attribute_id,cpa.attribute_value_id) in ((10,36),(2,5),(7,31),(9,28),(8,25))

SELECT SUM(ct_product_store_quantity.quantity) as quantity, `ct_product`.* 
FROM `ct_product`
LEFT JOIN `ct_productLang` ON `ct_product`.`id` = `ct_productLang`.`product_id`
LEFT JOIN `ct_product_store_quantity` ON `ct_product`.`id` = `ct_product_store_quantity`.`product_id` 
LEFT JOIN `ct_product_attribute` as cpa ON ct_product.id=cpa.product_id 
WHERE (cpa.attribute_id,cpa.attribute_value_id) in ((10,36),(2,5),(7,31),(9,28),(8,25)) and `ct_product`.`id`=1
GROUP BY `ct_product`.`id`
HAVING quantity > 0 
ORDER BY `id` DESC