如何在MySQL中过滤掉多个匹配键的记录?

时间:2010-11-10 17:12:35

标签: sql mysql aggregate-functions

我有两辆宝马,两辆梅赛德斯和一辆起亚。他们在带有car_id和brand的MySQL表中。我想知道我只有一个品牌的汽车。所以我期待的回归是这种情况下的一个记录,其中有一个'起亚'品牌,我不想让宝马或梅赛德斯出现。

修改

我过度简化了我的问题。对于那个很抱歉。所以这是真正的交易。我有一张带有sid和藏匿的桌子。 sid是独一无二的,但隐藏不是。我需要计算独特隐藏的数量。要做到这一点,我已经完成了,

select count(distinct hid) from table

为了计算完整的记录数,我只看了从

返回的行数
select * from table

现在,鉴于hid应该只出现一次或两次,并且假设我知道有多少次重复的hid,我应该能够将重复数量的一半的hid添加到唯一hid的数量并结束记录的全部数量。但是,我已经离开了7.所以试图找到我试图做的差异......

select * from ( 
 select distinct hid from table group by hid
  union
 select hid from table group by hid) group by hid

认为这会返回我在第二个查询中显示的不在第一个中的任何hids。但事实并非如此,而且我几乎要坚持从这里开始。有没有办法接受我的两个查询并在hids上获得差异?

我并不是指在“从独特的隐藏中减去总隐藏数量”中的差异,我的意思是差异,因为出于某种原因未在独特隐藏中显示的总数中的隐藏数。

2 个答案:

答案 0 :(得分:7)

使用:

  SELECT t.hid
    FROM YOUR_TABLE t
GROUP BY t.hid
  HAVING COUNT(*) > 1

此前:

  SELECT t.brand
    FROM YOUR_TABLE t
GROUP BY t.brand
  HAVING COUNT(*) = 1

答案 1 :(得分:0)

听起来好像你想要一个单独的查询,它将返回记录总数只发生一次的hid个数 - 如果是这样,请尝试:

select sum(count_hid) total_count, 
       sum(case count_hid when 1 then 1 else 0 end) singles_count
from
(select count(*) count_hid
 from your_table
 group by hid) sq