之前我曾询问过滤一列的多个值,其中所有列都必须存在于列中,否则不应给出结果。我收到了很好的答案,但这次我的要求有所改变,我需要一些不同的东西。
因此,我需要为一对值筛选一列,并且只有当所有这些值都存在且且所有这些值都与另一列中的一个值相关时才显示结果。
示例表:
+ ---- + -------- + ---------- +
| id |水果|颜色|
+ ---- + -------- + ---------- +
| 1 |苹果|绿色|
| 2 |苹果|黄色|
| 3 |香蕉|绿色|
| 4 |香蕉|黄色|
| 5 |芒果|绿色|
+ ---- + -------- + ---------- +
E.g。如果提交了“绿色和黄色”值,则只有具有这两种颜色的水果应该在结果集中,在本例中为“apple”和“banana”。所有其他行都应该被解雇。
我正在使用MySQL与PHP。
示例“错误代码”:
select Fruit FROM table WHERE Color = green AND Color = yellow
必须返回前4行而不是5行。
谢谢你 安德鲁
答案 0 :(得分:1)
因此,在这种情况下,您需要所有(水果,颜色)对完全出现两次。您可以使用计数来过滤掉,如下所示:
select fruit
from(
select fruit,count(1) as freq
from table
where color in (green,yellow)
group by 1
)freq_table
where freq=2;
当然,这假设没有(水果,颜色)对出现不止一次。如果是这样,那么你可能需要第三级子查询,你选择水果,表格中的颜色为1,2。
答案 1 :(得分:1)
假设您只需要每个水果名称一次:
SELECT Fruit FROM table WHERE Color IN ('green', 'yellow')
GROUP BY Fruit HAVING COUNT(*) >= 2
答案 2 :(得分:0)
好吧,你会想要自己加入这个表。
SELECT a.Fruit
FROM table AS a
JOIN table AS b ON a.Fruit = b.Fruit
WHERE a.Color = 'green'
AND b.Color = 'yellow'
但是,相反,我建议您正确normalizing您的数据,这将使这个查询更容易(并且效率更高)......