如何从JOIN获得DISTINCT结果

时间:2019-11-06 14:33:49

标签: mysql join distinct

如何获得最近十位访问者的不同结果,以及他们访问了多少次?

此:

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

返回最近的十位访问者

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

这将返回所有访客的计数:

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

它返回此值(返回的all_ref和ct值正确):

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

但应返回类似以下的内容:

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

让DISTINCT 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;

2 个答案:

答案 0 :(得分:0)

您可能首先找到与众不同的内容,然后加入表格-

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窗口功能的实现。如果您的MySQL版本支持Window功能,则可以简单地使用-

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

答案 1 :(得分:0)

最适合我的解决方案:

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;