2011-10-09 203 views
1

好吧所以我想找到所有的行中有相同的值(或至少一對)MySQL - 在WHERE子句中使用COUNT(*)?

I.E.

James| 19.193.283.19 
John| 20.134.232.344 
Jack| 19.193.283.19 
Jonny| 19.193.283.19 

我希望它在它返回行詹姆斯,傑克和強尼 - 作爲一個以上的行具有IP '19 .193.283.19' 。

我試着做回答什麼其他類似的問題:

select * 
from `Zombie` 
group by `Ip` 
having count(*) > 1 
order by `Ip` desc 

,但它只是返回1行的與類似「IP」我想每一行的一對或更多。

我該如何修改SQL,以便它返回所有分隔行?

非常感謝。

+0

請顯示您的架構。 – MikeyB

回答

5

你可以使用一個exists子查詢,發現有一個匹配的行所有行具有相同Ip

select * 
from YourTable as yt1 
where exists 
     (
     select * 
     from YourTable as yt2 
     where yt1.name <> yt2.name 
       and yt1.Ip = yt2.Ip 
     ) 

排序的行數與同Ip可以用自連接來完成,像:

select yt1.name 
,  yt1.Ip 
from YourTable as yt1 
join YourTable as yt2 
on  yt1.name <> yt2.name 
     and yt1.Ip = yt2.Ip 
group by 
     yt1.name 
,  yt1.Ip 
order by 
     count(yt2.name) desc 
+0

對我來說太快了!我無法在一分鐘內寫出相關的子查詢。 – amelvin

+0

完美地工作,謝謝ALOT! P.S如何訂購它,以便首先顯示大多數匹配的貨物? :) –

+0

答案只有一個名爲'YourTable'的表。它有兩次別名,一次爲'yt1',一次爲'yt2'。我已經在查詢中添加了'as yt1'來使這個更清晰。 「as」在SQL中是可選的。 – Andomar

0

另一種方式是與你已經使用子查詢(找到IPS現有的多行)加入你的表:

SELECT t.name 
    , t.Ip 
FROM 
    YourTable AS t 
    JOIN 
     (SELECT Ip 
      , COUNT(*) AS cnt 
     FROM YourTable 
     GROUP BY Ip 
     HAVING COUNT(*) > 1 
    ) AS td 
    ON td.Ip = t.Ip 
ORDER BY 
     td.cnt DESC 
    , t.Ip 
    , t.name