显示MySQL中包含相同值(特定值)的所有行

时间:2014-10-13 22:21:00

标签: mysql sql

我有MYSQL数据库

id | value1 | value2
---+--------+-------
1  |    1   |   1
2  |   10   |   3
3  |   10   |   3
4  |   10   |   2
5  |   11   |   3
6  |   11   |   2
7  |   12   |   1
8  |   13   |   4

如何返回同一value1出现多次但具体值的所有列的列表,例如,我想返回value1 = 10:

value1 | value2
  10   |   3
  10   |   3
  10   |   2

我使用了这样的计数查询:

SELECT value1,value2 FROM table WHERE value1 in ( SELECT value1 FROM table GROUP BY value1=10 having count(*) > 1 )

但是这样的回报

value1 | value2
   1   |   1
  10   |   3
  10   |   3
  10   |   2

为什么返回值为1 = 1?

任何想法? THX。

2 个答案:

答案 0 :(得分:1)

由于

,它返回值为1 = 1的行
GROUP BY value1=10

这是通过布尔表达式的结果来指定分组,该表达式为每一行返回1(TRUE),0(FALSE)或NULL。

要获取value1具有相同值的行数,您需要

GROUP BY value1

如果您只想返回value1等于10的行,则可以在WHERE子句中包含谓词

WHERE value1 = 10

如果我要返回指定的结果集,我会使用这样的查询来执行此操作:

SELECT t.value1
     , t.value2
  FROM ( SELECT r.value1
           FROM table r
          WHERE r.value1 = 10
          GROUP BY r.value1
         HAVING COUNT(1) > 1
       ) s
  JOIN table t
    ON t.value1 = s.value1

如果我想在谓词中使用子查询(而不是连接操作),我可以这样做:

SELECT t.value1, t.value2
  FROM tableX t
 WHERE t.value1 = 10
   AND (SELECT COUNT(*) FROM tableX r WHERE r.value1 = 10) > 1

以前的连接模式查询可以轻松扩展为返回多个值,我们可以将WHERE r.value = 10替换为WHERE r.value IN (10,20,30)。对于第二个查询,使用谓词中的子查询,不能轻易扩展,而不是没有(可能)调光相关子查询。

答案 1 :(得分:0)

试试这个: SELECT value1,value2 FROM table WHERE value1 in(      SELECT value1 FROM table其中value1 = 10)和(select count(*)where value1 = 10)> 1