Autor | Zpráva | ||
---|---|---|---|
T-fon Profil |
#1 · Zasláno: 24. 4. 2017, 12:27:37
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 |
#3 · Zasláno: 24. 4. 2017, 15:19:05
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 |
#4 · Zasláno: 24. 4. 2017, 16:18:32
V tabulce rate není sloupec id_users? Pak by ale spojení
ON id_users = users.id nedávalo smysl.
|
||
T-fon Profil |
#5 · Zasláno: 24. 4. 2017, 17:46:11
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, |
||
Kajman Profil |
#6 · Zasláno: 24. 4. 2017, 21:41:10
Dotaz z [#2] ale vrací všechny sloupce z tabulky users, tedy i jméno.
|
||
T-fon Profil |
#7 · Zasláno: 25. 4. 2017, 08:08:20
Máš pravdu. Udělal jsem přiblblou chybu, když jsem do dotazu doplňoval další věci. Díky moc.
|
||
Časová prodleva: 6 let
|
0