如何在mysql查询中过滤确定数量的行?

时间:2015-08-21 14:34:38

标签: mysql group-by having

我正在尝试使用MySQL查询中的HAVING语句获取特定结果。让我解释一下:

我有以下表格结构+数据:

| ID | COLUMN1| COLUMN2|
|----|--------|--------|
|1   |   52   | APPLE  |
|2   |   52   | APPLE  |
|3   |   58   | ORANGE |
|4   |   58   | ORANGE |
|5   |   61   | ORANGE |
|6   |   50   | ORANGE |
|7   |   50   | ORANGE |
|8   |   58   | LEMON  |
|9   |   58   | LEMON  |
|10  |   53   | LEMON  |
|11  |   53   | LEMON  |

当我提交此查询时:

select column1, column2, count(column2)
    from new_table     
    group by column1, column2      
    having count(column2) > 1
    order by column2;

结果如下:

'52', 'APPLE', '2'
'53', 'LEMON', '2'
'58', 'LEMON', '2'
'50', 'ORANGE', '2'
'58', 'ORANGE', '2'

但是,实际上,我想隐藏只出现在一个colum1中的所有结果,因此,我想要隐藏'APPLE'行,因为两次出现来自同一个Column1(52)。我想得到以下结果:

'53', 'LEMON', '2'
'58', 'LEMON', '2'
'50', 'ORANGE', '2'
'61', 'ORANGE', '1'
'58', 'ORANGE', '2'

2 个答案:

答案 0 :(得分:3)

您可以使用此查询:

SELECT column2
FROM new_table          
GROUP BY column2
HAVING COUNT(DISTINCT column1) > 1

获取与多个 column2值相关的column1值。

如果您在查询中加入以上内容,则会获得:

SELECT column1, column2, count(column2) AS cnt
FROM new_table          
WHERE column2 IN (SELECT column2
                  FROM new_table          
                  GROUP BY column2
                  HAVING COUNT(DISTINCT column1) > 1)
GROUP BY column1, column2      
ORDER BY column2;

Demo here

答案 1 :(得分:1)

您只想选择存在具有其他值的记录的水果,因此请使用WHERE EXISTS。然后聚合以获得具有记录计数的每个水果一个结果行。

select column1, column2, count(*)
from new_table
where exists
(
  select *
  from new_table other
  where other.column2 = new_table.column2
  and other.column1 <> new_table.column1
)
group by column1, column2;