sql >> Databáze >  >> RDS >> Mysql

Sečtěte výsledky několika dotazů a najděte 5 nejlepších v SQL

Do UNION výsledné řádky všech tří dotazů a poté vyberte 5 řádků s nejvyšší 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;

Příručka:

UNION ALL zachovat duplikáty.

Chcete-li přidat počty pro každý 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;

Záludná část je v tom, že ne každý event_id bude přítomen ve všech třech základních dotazech. Dbejte tedy na to, aby JOIN neztrácí řádky úplně a přidané položky se nezobrazují jako NULL .

Použijte UNION ALL , nikoli UNION . Nechcete odstraňovat stejné řádky, chcete je sečíst.

x je alias tabulky a zkratka pro AS x . Je vyžadováno, aby měl poddotaz název. Zde může být jakékoli jiné jméno.

Funkce SOL FULL OUTER JOIN není implementováno v MySQL (naposledy jsem to kontroloval), takže si musíte vystačit s UNION . FULL OUTER JOIN spojí všechny tři základní dotazy bez ztráty řádků.

Odpovězte na doplňující otázku

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;

Nebo chcete-li použít základní počty více způsoby:

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. MySQL převádí výstup časového rozdílu do formátu dne, hodiny, minuty, sekundy

  2. Jak zobrazit datum v britském formátu na SQL Server (T-SQL)

  3. MySql sečte prvky sloupce

  4. python 3.5 - django 1.10 - chyba instalace mysqlclient windows 7