如何从 JOIN 中获得 DISTINCT 结果

How can I get DISTINCT results from JOIN

我怎样才能得到最后十位访客的不同结果,并计算他们访问了多少次?

这个:

SELECT DISTINCT all_ref  FROM site_stats WHERE all_ref!='' ORDER BY id DESC LIMIT 10";

return最近十位访客

all_ref
Chicago, IL     
Chesapeake, VA  
Austin, TX  
San Jose, CA    
Houston, TX 
Newport News, VA    
Sebastian, FL   
Dublin, IE  
Menlo Park, CA
Waves, NC

这将 return 所有访问者计数:

SELECT all_ref, COUNT(*) AS ct FROM site_stats WHERE all_ref!='' 
AND all_ref!=',' GROUP BY all_ref ORDER BY ct DESC, all_ref

这就是我试图获取最近 10 位访问者及其访问次数的方法:

SELECT x.all_ref, x.ct
FROM (SELECT all_ref, COUNT(*) AS ct FROM site_stats WHERE all_ref!='' GROUP BY all_ref )
AS x LEFT JOIN site_stats AS f
ON f.all_ref=x.all_ref
ORDER BY f.id DESC LIMIT 10

它 return 是这样的(all_ref 和 ct 值 return 是正确的):

all_ref     ct  
Chicago, IL 26  
Chicago, IL 26  
Chesapeake, VA  18  
Chesapeake, VA  18  
Austin, TX  2   
San Jose, CA    3   
Houston, TX 1   
Chicago, IL 26  
Chicago, IL 26  
Chicago, IL 26

但应该 return 更像这样:

all_ref         ct  
Chicago, IL     26    
Chesapeake, VA  18  
Austin, TX      2   
San Jose, CA    3   
Houston, TX     1      
Chicago, IL     26
Pittsburgh, PA  11
Richmond, VA    52
Waves, NC       24
Grandy, NC      9

让它与众不同 x.all_ref 不是答案。

更新: 适合我的解决方案:

SELECT x.all_ref, x.ct
FROM (SELECT all_ref, MAX(id) AS id, COUNT(*) AS ct 
FROM site_stats 
WHERE all_ref!='' GROUP BY all_ref )
AS x LEFT JOIN site_stats AS f
ON f.all_ref=x.all_ref
GROUP BY x.all_ref
ORDER BY x.id DESC LIMIT 10;

您可以先找到不同的然后加入 table -

SELECT f.id
      ,x.all_ref
      ,x.ct
FROM (SELECT all_ref
            ,COUNT(*) AS ct
      FROM site_stats
      WHERE all_ref!=''
      GROUP BY all_ref ) AS x
LEFT JOIN (SELECT DISTINCT id, all_ref
           FROM site_stats) AS f ON f.all_ref=x.all_ref
ORDER BY f.id DESC LIMIT 10

特此通知,这是 COUNT window 函数的实现。如果你的 MySQL 版本支持 Window 功能,你可以简单地使用 -

SELECT DISTINCT id
               ,all_ref
               ,COUNT() OVER() AS ct
FROM site_stats
WHERE all_ref!=''
ORDER BY id DESC LIMIT 10

适合我的解决方案:

FROM (SELECT all_ref, MAX(id) AS id, COUNT(*) AS ct 
FROM site_stats 
WHERE all_ref!='' GROUP BY all_ref )
AS x LEFT JOIN site_stats AS f
ON f.all_ref=x.all_ref
GROUP BY x.all_ref
ORDER BY x.id DESC LIMIT 10;