SELECT查询,其中1列等于2个变量

时间:2013-01-09 15:09:05

标签: mysql sql

问题: 我想选择具有1和3的option_value_id的产品。但是,正如您所看到的,它还将显示仅具有1个option_value_ids的产品。

我尝试添加AND代替IN,但显然没有显示结果。

答案可能很简单,但我现在似乎无法弄明白。 有人可以帮帮我吗?即使是一个小提示也可以被欣赏。

enter image description here

4 个答案:

答案 0 :(得分:4)

这称为Relation Division,这是一种方法:

SELECT *
FROM TABLEName 
WHERE Product_ID IN(SELECT Product_ID
            FROM Tablename
            WHERE option_value_id IN(1, 3)
            GROUP BY Product_ID
            HAVING COUNT(option_value_id) = 2);

SQL Fiddle Demo

这会给你:

| ID | PRODUCT_ID | OPTION_VALUE_ID |
-------------------------------------
|  1 |          1 |               1 |
|  3 |          1 |               3 |
| 13 |          2 |               3 |
| 14 |          2 |               1 |

答案 1 :(得分:0)

这是将事物看作一组的例子。我认为最好的方法是使用SQL的聚合,特别是having子句。在MySQL语法中,这看起来像:

select pa.product_id
from Product_Attributes pa
group by pa.product_id
having max(pa.option_value_id = 1) = 1 and
       max(pa.option_value_id = 3) = 1

答案 2 :(得分:0)

这是一个常见问题,称为关系部门,在SO中甚至还有一个标记: sql-match-all

通常,(product_id, option_value_id)有一个唯一约束,因此一种解决方案是使用2个连接(如果要检查N个属性,则为N个连接):

SELECT p.*                 -- whatever columns you need 
FROM product AS p          -- from the `product` table
  JOIN products_attributes AS pa1
    ON  pa1.option_value_id = 1
    AND pa1.product_id = p.product_id
  JOIN products_attributes AS pa2
    ON  pa2.option_value_id = 3
    AND pa2.product_id = p.product_id ;

有一个类似的问题,有超过10种不同的方法可以达到相同的结果(和Postgres的基准): How to filter SQL results in a has-many-through relation

答案 3 :(得分:0)

试试这个:

SELECT * 
FROM products_attributes 
WHERE option_value_id IN (1, 3) 
GROUP BY product_id 
HAVING COUNT(*) = 2