两个IN()运算符,一列

时间:2011-01-26 18:28:42

标签: sql mysql

我试图基于传递两个IN()运算符来选择一行,但是对于同一列。这就是我的尝试:

SELECT DISTINCT `product_id`, `department` 
  FROM `products` 
 WHERE `department` IN ('Star Wars', 'Scarface', 'Winnie the Pooh') 
   AND `department` IN ('T-Shirts', 'Frisbees', 'Waffles')

查询不返回任何结果。

products表包含两个重要列:product_iddepartment。这会将同一产品分配给多个部门。例如,有一个Darth Vader T恤分配给三个不同的部门 - 星球大战,T恤和华夫饼。

我正在尝试制作一个表单,允许用户搜索“Darth Vader”并指定仅返回“星球大战”和“T恤”部门的结果,同时跳过所有其他Darth Vader纪念品。

实现这一目标的最佳方法是什么?

5 个答案:

答案 0 :(得分:3)

WHERE IN (...)基本上相当于where x='a' or x='b' or x='c'...。您对双WHERE IN所做的是说“部门必须是第二组中的第一组AND部分之一。基本上”1是2是3“。

答案 1 :(得分:2)

实际上,数据库的结构有点奇怪。你应该有一个products表和一个departments表以及一个可以连接它们的最后一个表product_to_deptt

这样,做你想做的事情会更容易。

答案 2 :(得分:1)

除非您故意尝试IN仅重叠值,否则您应该在一个SELECT语句中包含所有相关部门。如果您必须使用上述语法,请考虑使用OR

答案 3 :(得分:1)

SELECT *
  FROM `products`   
 WHERE `department` IN ('Star Wars', 'T-Shirts')
   AND whatever_it_is = 'Darth Vader';

答案 4 :(得分:0)

您正在寻找部门在一个列表中的产品和第二个列表中的产品。假设两个部门列表是互斥的,则内部自连接可用于AND条件:

select p1.product_id
    from products p1
        inner join products p2
            on p1.product_id = p2.product_id
                and p2.department in ('T-Shirts', 'Frisbees', 'Waffles')
    where p1.department in ('Star Wars', 'Scarface', 'Winnie the Pooh')