sql >> Databasteknik >  >> RDS >> Mysql

Summa resultaten av några frågor och hitta topp 5 i SQL

Till UNION de resulterande raderna av alla tre frågorna och välj sedan de 5 raderna med det högsta 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;

Manualen:

UNION ALL för att behålla dubbletter.

För att lägga till antalet för varje 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;

Det knepiga här är att inte alla event_id kommer att finnas i alla tre basfrågor. Så se till att en JOIN förlorar inte rader helt och tillägg blir inte NULL .

Använd UNION ALL , inte UNION . Du vill inte ta bort identiska rader, du vill lägga till dem.

x är ett tabellalias och en förkortning för AS x . Det krävs för att en underfråga ska ha ett namn. Kan vara vilket annat namn som helst här.

SOL-funktionen FULL OUTER JOIN är inte implementerat i MySQL (senast jag kollade), så du får nöja dig med UNION . FULL OUTER JOIN skulle slå samman alla tre basfrågor utan att rader förloras.

Svar på följdfråga

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;

Eller, för att använda basantalet på flera sätt:

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. MySqlCommand().ExecuteReader().GetString() fungerar inte

  2. Få alla datum i månaden tillsammans med data från tabellen

  3. Hur man aktiverar långsamma frågeloggar i AWS RDS MySQL

  4. SQL Server Performance TOP CPU Query -2