为每个ID

时间:2015-12-17 15:07:18

标签: mysql

我有下表:

id     | hash
1        aaa
1        bbb
1        ccc
2        ddd
2        eee
2        aaa
3        bbb

我想为提供的ID获取唯一的哈希值,例如对于ID 1,我会在这里获得1,因为aaa和bbb已经存在于不同的ID中。对于2我得到2,beucase只有aaa存在于别处,等等。

期望的结果:

id | result
 1      1
 2      2

我该怎么做?

编辑:

我试过了:

SELECT *
FROM table1 t1
LEFT JOIN table2 t2 ON t1.hash = t2.hash
WHERE t1.id = 1 AND t2.id != 1;

但它不会返回正确的结果,而是返回1个ID中存在的哈希值,以及其中一个哈希值。

4 个答案:

答案 0 :(得分:1)

select ID,COUNT(hash) as Expr1
from table1 
where hash not in 
  (
     select hash 
     from 
     table1 
     group by hash 
     having count(ID)>1
   ) 
 group by ID

答案 1 :(得分:1)

使用having子句获取唯一哈希值,然后计算每个id的哈希值:

select id, count(*)
from
(
  select hash, id
  from mytable
  group by hash
  having count(*) = 1
) one_time_hashes
group by id;

答案 2 :(得分:0)

你的问题是: 并且我想为提供的ID获取唯一的哈希值,例如对于ID 1,我会在这里获得1,因为aaa和bbb已经存在于不同的ID中。对于2我得到2,beucase只有aaa存在于别处,等等。 1,返回1, 2,返回2 ... 你确定你正确地解释了你想要的吗?

我想你想要为id = 1返回ccc,因为这个哈希是唯一的,ddd或eee代表2 ...

如果是这样,这个例子应该有效(我在Oracle上):

select hash
from table t1
where ID = 1
and hash not in (select hash 
               from table t2
              where t2.hash = t1.hash
                and T2.ID   <> t1.id)
and rownum=1 
;

请注意,您需要一些性能指标。

希望这会有所帮助。

基督教

答案 3 :(得分:0)

SELECT x.id
     , COUNT(*) 
  FROM my_table x 
  LEFT 
  JOIN my_table y 
    ON y.id <> x.id 
   AND y.hash = x.hash 
 WHERE y.id IS NULL 
 GROUP 
    BY id;

NOT EXISTS类型的解决方案可能会更快。