Как я могу получить отличительные результаты от JOIN - PullRequest
0 голосов
/ 06 ноября 2019

Как я могу получить отличные результаты последних десяти посетителей со счетом того, сколько раз они посетили?

Это:

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 голосов
/ 11 ноября 2019

Решение, которое работает для меня:

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;
0 голосов
/ 06 ноября 2019

Сначала вы можете найти отличное, а затем присоединиться к таблице -

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...