2012-08-08 53 views
0

我有一个具有以下字段的表:这是否正确的语句来检查重复值?

domainname | domian_name_cert_no | keyvalue 

domian_name_cert_no是独特的,它有一个计数器结束; 1,2,3等。有可能两个或多个domian_name_cert_no共享keyvalue。我需要列出这些案例。因此,我有以下陈述在第一个domian_name_cert_no中列出keyvalue的出现次数(即no = 1,我不关心_2和_3中的重复项)。

select domainname, domian_name_cert_no, count(keyvalue), keyvalue 
from db.table 
where domian_name_cert_no like '%_1' 
group by (keyvalue) 
having count(keyvalue)>1; 

假设一个输出,如: XYX,xyx_1,10,777

然后,根据前面的输出,我知道有10个发生,现在我需要列出已经共享这些域名keyvalue详细,所以我用:

SELECT a.* 
FROM db.table a 
      INNER JOIN 
      (
       SELECT keyvalue 
       FROM db.table 
       GROUP by keyvalue 
       HAVING COUNT(keyvalue) = 10 
      ) b 
       ON a.keyvalue = b.keyvalue; 

是根据我的需要解释这些正确的语句?我并不确定我在第二个陈述中做了什么:HAVING COUNT(keyvalue) = 10

MySQL专家请向我确认这些陈述是否正确。

回答

0

每OP变更的补充意见

你的第一个查询看起来不完全正确。

select keyvalue, count(domian_name_cert_no) as rec_count 
from db.table 
where domian_name_cert_no like '%_1' 
group by keyvalue 
having rec_count>1; 

对于你的第二个查询,我不确定你在尝试什么。我最好的猜测是你想获得你在第一个查询中识别出的关键值的所有记录。只需将您的第一个查询插入到内部联接中。您将不需要0​​声明。

select a.* 
    from 
    db.table a 
    inner join 
    (select keyvalue, count(domian_name_cert_no) as rec_count 
    from db.table 
    where domian_name_cert_no like '%_1' 
    group by keyvalue 
    having rec_count>1) b 
    on a.keyvalue = b.keyvalue; 

希望我明白你的问题。

+0

是的。第二个查询是列出具有该键值的所有记录。例如,在第一个查询中,如果我有10个记录有一个特定的键值,这个查询就会为我列出它们。我会尝试你的第一个查询。 – 2012-08-08 20:06:40

+0

当我编辑第一条语句就像你所建议的那样,我得到了0个结果,而不是这种情况。我会给你一个存储值外观的例子。这些专栏在我之前的文章中有说明。假设存储的值如下:1)a.yahoo.com,a.yahoo.com_1,222,2)a.yahoo.com,a.yahoo.com_2,333,3)a.yahoo.com,a.yahoo。现在因为我有'domian_name_cert_no'内容:a.msn.com_1与另一个'domian_name_cert_no'内容具有相同的'keyvalue':a.msn.com_1 a.msn.com,a.msn.com_1,222. – 2012-08-10 09:38:17

+0

.yahoo.com_1,这里我需要计数器为2来告诉我这个关键值发生了两次。在第二个查询中,我需要列出所有'domian_name_cert_no'内容以及共享某个'keyvalue'的corressponding'domainname',在我们的例子中为222。 – 2012-08-10 09:39:23