Mysql
 sql >> база данни >  >> RDS >> Mysql

Сумирайте резултатите от няколко заявки и след това намерете топ 5 в SQL

Към UNION получените редове от всичките три заявки и след това изберете 5-те реда с най-висока amount :

(SELECT event_id, count(*) AS amount
FROM   pageview 
GROUP  BY event_id
ORDER  BY pageviews DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   upvote
GROUP  BY event_id
ORDER  BY upvotes DESC, rand()
LIMIT  1000)

UNION ALL
(SELECT event_id, count(*)
FROM   attending
GROUP  BY event_id
ORDER  BY attendants DESC, rand()
LIMIT  1000)

ORDER  BY 2 DESC
LIMIT  5;

Ръководството:

UNION ALL за запазване на дубликати.

За добавяне на броя за всеки event_id :

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) AS amount
    FROM   pageview 
    GROUP  BY event_id
    ORDER  BY pageviews DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   upvote
    GROUP  BY event_id
    ORDER  BY upvotes DESC, rand()
    LIMIT  1000)
    
    UNION ALL
    (SELECT event_id, count(*)
    FROM   attending
    GROUP  BY event_id
    ORDER  BY attendants DESC, rand()
    LIMIT  1000)
    ) x
GROUP  BY 1
ORDER  BY sum(amount) DESC
LIMIT  5;

Трудната част тук е, че не всеки event_id ще присъства и в трите основни заявки. Затова се погрижете за JOIN не губи напълно редове и добавянията не се оказват NULL .

Използвайте UNION ALL , а не UNION . Не искате да премахвате идентични редове, искате да ги добавяте.

x е псевдоним на таблица и съкращаване на AS x . Изисква се подзаявката да има име. Тук може да бъде всяко друго име.

Функцията SOL FULL OUTER JOIN не е внедрен в MySQL (последния път, когато проверих), така че трябва да се справите с UNION . FULL OUTER JOIN ще се присъедини към трите основни заявки, без да губи редове.

Отговор на последващ въпрос

SELECT event_id, sum(amount) AS total
FROM (
   (SELECT event_id, count(*) / 100 AS amount
    FROM   pageview ... )
    
    UNION ALL
    (SELECT event_id, count(*) * 5 
    FROM   upvote ... )
    
    UNION ALL
    (SELECT event_id, count(*) * 10
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY  sum(amount) DESC
LIMIT  5;

Или, за да използвате основния брой по няколко начина:

SELECT event_id
      ,sum(CASE source
              WHEN 'p' THEN amount / 100
              WHEN 'u' THEN amount * 5
              WHEN 'a' THEN amount * 10
              ELSE 0
           END)  AS total
FROM (
   (SELECT event_id, 'p'::text AS source, count(*) AS amount
    FROM   pageview ... )
    
    UNION ALL
    (SELECT event_id, 'u'::text, count(*)
    FROM   upvote ... )
    
    UNION ALL
    (SELECT event_id, 'a'::text, count(*)
    FROM   attending ... )
    ) x
GROUP  BY 1
ORDER  BY 2 DESC
LIMIT  5;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Създаване на MySQL пространствена колона - Тип данни на точка с lat long без използване на таблицата Alter

  2. проверете наличността на стая с SQL

  3. Създайте база данни при стартиране на docker-compose

  4. Как да създадете пагинация с PDO PHP

  5. Как да проверя дали mysqli_query е изтрил редове