Autor Zpráva
T-fon
Profil
Ahoj, poprosil bych o pomoc s SQL dotazem.
Mám tabulku s uživateli(users) a další, kde je hodnocení(rate). Pro výpis pořadí z minulého kalendářního měsíce jsem vytvořil tento funkční SQL dotaz:
SELECT   Sum(hodnoceni)/Count(hodnoceni) AS hodnoceni1, 
         users.id                        AS id1, 
         users.jmeno                     AS jmeno1, 
FROM     rate 
JOIN     users 
ON       id_users = users.id 
WHERE    Year(rate.datum) = year(CURRENT_DATE   - interval 1 month) 
AND      month(rate.datum) = month(CURRENT_DATE - interval 1 month) 
GROUP BY id_users 
ORDER BY hodnoceni DESC, 
         jmeno ASC limit 50


A teď se pokouším vytvořit porovnání z minulého a předminulého kalendářního měsíce:
VAR1:
SELECT   * 
FROM     ( 
                  SELECT   Sum(hodnoceni)/Count(hodnoceni) AS hodnoceni1, 
                           users.id                        AS id1, 
                           users.jmeno                     AS jmeno1, 
                  FROM     rate 
                  JOIN     users 
                  ON       id_users = users.id 
                  WHERE    Year(rate.datum) = year(CURRENT_DATE   - interval 1 month) 
                  AND      month(rate.datum) = month(CURRENT_DATE - interval 1 month) 
                  GROUP BY id_users 
                  UNION 
                  SELECT   sum(hodnoceni)/count(hodnoceni) AS hodnoceni2, 
                           users.id                        AS id2, 
                           users.jmeno                     AS jmeno2, 
                  FROM     rate 
                  JOIN     users 
                  ON       id_users = users.id 
                  WHERE    year(rate.datum) = year(CURRENT_DATE   - interval 2 month) 
                  AND      month(rate.datum) = month(CURRENT_DATE - interval 2 month) 
                  GROUP BY id_users) AS u 
ORDER BY (hodnoceni1-hodnoceni2) DESC limit 50

VAR2:
(SELECT Sum(hodnoceni)/Count(hodnoceni) AS hodnoceni1, 
                                                        users.id    AS id1, 
                                                        users.jmeno AS jmeno1, 
                                                 FROM   rate 
                                                        JOIN users 
                                                          ON id_users = users.id 
                                                 WHERE  Year(rate.datum) = Year(CURRENT_DATE - INTERVAL 1 MONTH) 
                                                        AND Month(rate.datum) = Month(CURRENT_DATE - INTERVAL 1 MONTH) 
                                                 GROUP  BY id_users ORDER BY id1)
                                                 UNION
                                                 (SELECT Sum(hodnoceni)/Count(hodnoceni) AS hodnoceni2, 
                                                        users.id    AS id2, 
                                                        users.jmeno AS jmeno2, 
                                                        users.foto AS foto2 
                                                 FROM   rate 
                                                        JOIN users 
                                                          ON id_users = users.id 
                                                 WHERE  Year(rate.datum) = Year(CURRENT_DATE - INTERVAL 2 MONTH) 
                                                        AND Month(rate.datum) = Month(CURRENT_DATE - INTERVAL 2 MONTH) 
                                                 GROUP  BY id_users ORDER BY id2)
                                                 ORDER  BY (hodnoceni1-hodnoceni2) DESC 
                                                 LIMIT  50

Nevím jestli UNION je správná cesta, každopádně oba dotazy hlásí "neznámý sloupec hodnoceni2". Předem děkuji za jakoukoliv pomoc.
Kajman
Profil
Nedělal bych union, spíše join mezi dvěma dvěma dotazy. Pokud by tam měli být jen uživatelé, co mají hodnocení v obou měsících, tak něco takového..


SELECT *
FROM   (SELECT Avg(hodnoceni) AS hodnoceni1,
               id_users       AS id1
        FROM   rate
        WHERE  datum >= '2017-02-01'
               AND datum < '2017-03-01'
        GROUP  BY id_users) AS minuly
       JOIN (SELECT Avg(hodnoceni) AS hodnoceni2,
                    id_users       AS id2
             FROM   rate
             WHERE  datum >= '2017-01-01'
                    AND datum < '2017-02-01'
             GROUP  BY id_users) AS predminuly
         ON minuly.id1 = predminuly.id2
       JOIN users
         ON minuly.id1 = users.id
ORDER  BY ( hodnoceni1 - hodnoceni2 ) DESC
LIMIT  50  

Osobně bych nedával join na users dovnitř poddotazů (jméno bude dle id vždy stejné) a udělal až do
T-fon
Profil
Díky!
Musel jsem v obou poddotazech ještě přidat za FROM rate ještě JOIN users ON id_users = users.id, jinak mi to hlásilo neznámý sloupec id_users.
Kajman
Profil
V tabulce rate není sloupec id_users? Pak by ale spojení ON id_users = users.id nedávalo smysl.
T-fon
Profil
Sorry, předtim jsem napsal špatnej sloupec, mělo to být users.id (jako neznámý).
V tabulce rate jsou sloupce id_users, hodnoceni, datum a další. No já ten tvůj kód trochu upravoval, protože potřebuju id, jméno a další položky z tabulky users, takže jsem ten dotaz začínal takhle:
SELECT * 
FROM   (SELECT Avg(hodnoceni) AS hodnoceni1, 
    users.id                   AS id1, 
    users.jmeno            AS jmeno1,
Což právě nahlásilo neznámý sloupec a vyřešil jsem to přidáním JOIN (což teda asi není nejlepší řešení, ale funguje to).
Kajman
Profil
Dotaz z [#2] ale vrací všechny sloupce z tabulky users, tedy i jméno.
T-fon
Profil
Máš pravdu. Udělal jsem přiblblou chybu, když jsem do dotazu doplňoval další věci. Díky moc.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: