【问题标题】:filtering for multiple values on one column based on values from another column根据另一列中的值过滤一列上的多个值
【发布时间】:2011-01-03 17:04:04
【问题描述】:

之前我问过如何为多个值过滤一列,其中所有值都必须存在于列中,否则不应给出任何结果。我收到了很好的答案,但这次我的要求有所改变,我需要一些不同的东西。

所以我需要为一对值过滤一列,并且仅当所有这些值都存在并且所有这些值都与另一列中的一个值相关时才显示结果。

示例表:

+----+--------+----------+
|编号 |水果 |颜色 |
+----+--------+----------+
| 1 |苹果| 高分辨率照片| CLIPARTO绿色 |
| 2 |苹果| 高分辨率照片| CLIPARTO黄色 |
| 3 |香蕉| 高分辨率照片| CLIPARTO绿色 |
| 4 |香蕉| 高分辨率照片| CLIPARTO黄色 |
| 5 |芒果 |绿色 |
+----+--------+----------+

例如如果提交了值“绿色和黄色”,则只有同时具有这两种颜色的水果才会出现在结果集中,在本例中为“苹果”和“香蕉”。所有其他行都应该被忽略。

我正在使用 MySQL 和 php。

“错误代码”示例:

select Fruit FROM table WHERE Color = green AND Color = yellow 

必须返回前 4 行,但不能返回 5。

谢谢
安德鲁

【问题讨论】:

    标签: php sql mysql


    【解决方案1】:

    假设您只需要每个水果名称一次:

     SELECT Fruit FROM table WHERE Color IN ('green', 'yellow')
        GROUP BY Fruit HAVING COUNT(*) >= 2
    

    【讨论】:

    • 虽然所有三个答案都给出了相同的正确结果,但这个最适合我。谢谢
    【解决方案2】:

    因此,在这种情况下,您需要所有恰好出现两次的 (fruit,color) 对。您可以使用计数来过滤掉它,如下所示:

    select fruit from( select fruit,count(1) as freq from table where color in (green,yellow) group by 1 )freq_table where freq=2;

    当然,这假设没有 (fruit,color) 对出现多次。如果是这样,那么您可能需要第三级子查询,您可以从表组中选择fruit,color by 1,2。

    【讨论】:

    • 好吧,学究式地它可能超过 2,因为它似乎对数据没有限制(因此理论上可能有超过 2 个结果行,其中一些是重复的)。所以我会将WHERE freq = 2 更改为WHERE freq >= 2(其中2 是IN 子句中的值数)...
    • 肯定不止一次出现水果,颜色对。谢谢你的帮助,我去测试一下。
    【解决方案3】:

    好吧,你会想自己加入表格。

    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 您的数据,这将使此查询更容易(并且更有效)...

    【讨论】:

    • 实际上,这个“示例”表是通过连接其他表生成的“虚拟结果集”,因此我无法进一步对其进行规范化(至少据我所知)。谢谢你的回复,我试试你的代码
    • 我不清楚你为什么认为样本数据没有标准化?
    • @Larry:很简单。颜色显然是一个重复的元素,所以它不符合2nd Normal Form 的条件。 (水果也可以这样说)。我并不是说它需要 100% 完全标准化,只是它绝对不是第二正常或更高......
    • 对我来说它看起来很规范(但我会放弃 ID 并使用 {fruit,color} 作为键)。
    • 颜色的变化似乎与 ID 或水果值无关。
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多