我试图基于传递两个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_id
和department
。这会将同一产品分配给多个部门。例如,有一个Darth Vader T恤分配给三个不同的部门 - 星球大战,T恤和华夫饼。
我正在尝试制作一个表单,允许用户搜索“Darth Vader”并指定仅返回“星球大战”和“T恤”部门的结果,同时跳过所有其他Darth Vader纪念品。
实现这一目标的最佳方法是什么?
答案 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')