【问题标题】:SELECT multiple rows with WHERE使用 WHERE 选择多行
【发布时间】:2011-09-27 00:51:53
【问题描述】:
PID       VALUE
3        1
4        3
1        9
1        3

如何选择 值为 3 和 9 的行?我试过了

从 VALUE = 3 和 VALUE = 9 的表中选择 PID

所以我得到类似下面的东西,而不是我得到一个空集。

PID      
1       

PID 4 不应包含在结果中,因为它没有 VALUE 9

【问题讨论】:

  • 哇,人们真的不会阅读这些问题的实际含义吗?我会使用group by PIDwhere value in (3, 9)having count(*) = 2
  • 令人惊讶的是有多少人不知道“两者”是什么意思。不过,公平地说,OP 对“行”一词的使用具有误导性。

标签: php mysql sql-match-all


【解决方案1】:

WHERE 子句一次只能针对给定表中的 一个 行评估条件。您不能使条件跨越多行。

但是您可以使用 自连接 将同一表中的多行匹配到结果集中的一行中,因此您可以应用涉及两者的条件。

SELECT t1.pid
FROM table t1 JOIN table t2 ON t1.pid=t2.pid
WHERE t1.value = 3 AND t2.value = 9;

另一种解决方案是使用 GROUP BY 并计算 distinct 值:

SELECT t.pid
FROM table t
WHERE t.value IN (3,9)
GROUP BY t.pid
HAVING COUNT(DISTINCT t.value) = 2;

【讨论】:

  • 好的答案 - 问题的细节不够,但如果表中的数据量更大,答案会改变
  • 我会说使用 GROUP BY 方法,因为不能保证第一个连接顺序;即,t1.value 可能是 9,t2.value 可能是 3。
  • @Paul Sonier:WHERE 子句确保 t1 does 匹配 value 为 3 的行,并且 t2 does 匹配 value 为9. 也就是说,它会检查所有行,直到找到符合条件的行。
【解决方案2】:

这个,我觉得更符合你的追求:

select PID from table
where VALUE IN (3, 9) 
group by PID
having count(*) = 2

基本上,这会查找具有 3 或 9 的条目,将它们组合在一起,并仅返回计数为 2 的条目。我在这里假设(可能是错误的)每个 PID 只能有一个 3 和一个 9。

【讨论】:

  • 是的,这通常不是一个安全的假设。如果两行的值都为 9,则 COUNT(*) 将返回 2,即使不存在值为 3 的行。
  • 很公平,它仍然应该给 OP 一个大致的方向。我会使用 DISTINCT 对其进行更正,但该解决方案已被提出,因此我将保持原样。
  • 是的,这取决于表。如果 (pid,value) 有一个 UNIQUE 约束,那么您的解决方案可以正常工作。
【解决方案3】:

除了“分组依据”,您还可以考虑“选择不同”以返回一组唯一的 pid。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多