MySQL - 在WHERE子句中使用COUNT(*)?

问题描述:

好吧所以我想找到所有的行中有相同的值(或至少一对)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

你可以使用一个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

另一种方式是与你已经使用子查询(找到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