Autor | Zpráva | ||
---|---|---|---|
Fury Profil * |
#1 · Zasláno: 30. 10. 2017, 15:14:00
Zdravím,
mám následující dva dotazy: 1select select
AVG(a.answer) average
from
answers a
left join
users u
on u.id = a.user_id
where
u.role in (1,2) 1select select
AVG(a.answer) average
from
answers a
left join
users u
on u.id = a.user_id
where
u.role in (3,4) A hledám cestu, zda se dají tyto dva dotazy sjednotit do jednoho a dělat rozdíl mezi AVG u uživatele s role (1,2) a u uživatele s role (3,4). Zkoušel jsem upravit select, kde jsem dal: Ale to bohužel vracelo jiný průměr. Dá se to řešit pouze jedním dotazem? Díky moc! |
||
TomášK. Profil * |
#2 · Zasláno: 30. 10. 2017, 15:54:33
To je jen o vhodném přeskládání čísel, ne? Něco jako
SUM(IF(u.role IN (1,2), a.answer, 0)) / SUM(u.role IN(1,2)) - SUM(IF(u.role IN (3,4), a.answer, 0)) / SUM(u.role IN(3,4)) . Dva dotazy jsou o něco přehlednější, stačí INNER JOIN .
|
||
Kajman Profil |
#3 · Zasláno: 30. 10. 2017, 16:01:00
1SELECT (SELECT Avg(a.answer) average SELECT (SELECT Avg(a.answer) average
FROM answers a
JOIN users u
ON u.id = a.user_id
WHERE u.role IN ( 1, 2 ))
-
(SELECT Avg(a.answer) average
FROM answers a
JOIN users u
ON u.id = a.user_id
WHERE u.role IN ( 3, 4 )) rozdil |
||
Fury Profil * |
#4 · Zasláno: 30. 10. 2017, 16:08:23
Super, díky za radu, akorát narazil jsem tam ještě na jednu věc, pokud bych dotaz upravil, že bych výsledky groupoval dle type_id, tzn. že dotaz by vypadal:
1SELECT Avg(a.answer) average SELECT Avg(a.answer) average
FROM answers a
JOIN users u
ON u.id = a.user_id
WHERE u.role IN ( 1, 2 ))
GROUP BY a.type_id Výsledky by tedy byly např: 1type_id average type_id average
1 2,3847
2 2,9583
3 2,4758 A já bych chtěl mít rozdíly mezi všemi type_id u u.role IN ( 1, 2 ) vs u.role IN ( 3, 4 ). Dá se i toto udělat dotazem do DB, nebo to už spíše řešit na úrovni PHP? Díky |
||
tttt Profil * |
#5 · Zasláno: 30. 10. 2017, 21:01:32
1SELECT SELECT
types.id,
t1.average - t2.average AS diff
FROM
types
JOIN (
SELECT
AVG(a.answer) average
FROM
answers a
JOIN users u ON u.id = a.user_id
WHERE u.role IN ( 1, 2 )
GROUP BY
) t1 ON types.id = t1.type_id
JOIN (
SELECT
AVG(a.answer) average
FROM
answers a
JOIN users u ON u.id = a.user_id
WHERE u.role IN ( 3, 4 )
GROUP BY
) t2 ON types.id = t2.type_id Vymysli si, jaké chceš JOINy a případně ošetři null v average.
|
||
Časová prodleva: 7 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0