2011-08-17 47 views
6

任何人都可以帮助我建立一个基于查询语句的查询。MySQL查询 - 1列上有多个WHERE子句

正如您所看到的,我有一个产品,其规格和特定的组建在前端。我知道这个问题,1列不能同时是2个值,但我只需要那些2组中的产品。

为了说明,product_specification_sid,ID 2种3和图4是尺寸和去休息8〜11的颜色,所以我想选择具有2和3

内加入表双ISN”的产物因为这些组(大小,颜色)在未来可能会有所不同。

SELECT 
    products.*, 
    categories.*, 
    manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE 
    product_active = 1 
AND 
(
    product_specification_sid in (3) 
AND 
    product_specification_sid in (8,9,6,7,10,11) 
) 
GROUP BY product_id 
+1

我发布了一个答案,它进行了两次内连接。但后来我读到你的陈述,说你已经想过了。我不明白你为什么说这不是一个选项? – Eljakim 2011-08-17 12:43:32

回答

5

您可以改为使用having子句。

SELECT 
    products.*, 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE product_active = 1 
GROUP BY product_id 
HAVING COUNT(CASE WHEN product_specification_sid in (3) THEN 1 END) > 0 
AND COUNT(CASE WHEN product_specification_sid in (8,9,6,7,10,11) THEN 1 END) > 0 
+2

那些有条件的人应该是`> 1`吗?我会认为`> = 1` /`> 0`或者`= 1`。 – 2011-08-17 12:44:56

+1

该查询一开始并没有工作,但@Sam DeHaan修复了它!我取代了> 1 bij> = 1,它就像一个魅力! – PvdL 2011-08-17 12:55:04

1

据我了解,你要寻找的是具有符合某些条件的两个匹配product_specification记录的产品记录。听起来像我这样直截了当的解决方案是:

SELECT products.*, categories.*, manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ps1 ON ps1.product_specification_pid=product_id 
INNER JOIN product_specifications ps2 ON ps2.product_specification_pid=product_id 
WHERE  product_active = 1 
    AND ps1.product_specification_sid in (3) 
    AND ps2.product_specification_sid in (8,9,6,7,10,11) 

顺便说一句,“group by”将无法正常工作。您必须将所有不是聚合的组合在一起,并且每个表必须至少有一列,所以您至少有三个非聚合。 (好吧,也许MySQL在这里有一些扩展,但是在标准的SQL中将会被获得。)