如何从 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;
我怎样才能得到最后十位访客的不同结果,并计算他们访问了多少次?
这个:
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;