如何组织我的查询与这么多的ands

vuktfyat  于 2021-06-19  发布在  Mysql
关注(0)|答案(3)|浏览(204)

我的查询如下所示:

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 每个产品可以有多个atter.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 . 如果我使用或它正在检索这两种产品 id=1 以及 id=2 . 不知道现在是否更清楚了。

w1e3prcc

w1e3prcc1#

你可以试着用 (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

vlf7wbxs

vlf7wbxs2#

我很确定那些应该是手术室,因为你不可能同时拥有所有的身份证。考虑到这一点,您应该能够在中使用。

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

esbemjvw3#

我真的不知道你想完成什么,但你应该/可以使用where in,因为每个人都在评论中指出你正在寻找一个具有多个值的字段。。。
但是,关于和问题,你可以/应该使用 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

相关问题