Autor Zpráva
Fury
Profil *
Zdravím,

mám následující dva dotazy:
1select 
2    AVG(a.answer) average
3from 
4    answers a
5left join 
6    users u
7        on u.id = a.user_id
8where 
9    u.role in (1,2)
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 
2    AVG(a.answer) average
3from 
4    answers a
5left join 
6    users u
7        on u.id = a.user_id
8where 
9    u.role in (3,4)
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:

AVG(IF(u.role = 3 or u.role = 4, a.answer, ''))
AVG(IF(u.role = 3 or u.role = 4, a.answer, ''))

Ale to bohužel vracelo jiný průměr.

Dá se to řešit pouze jedním dotazem?

Díky moc!
TomášK.
Profil *
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
1SELECT (SELECT Avg(a.answer) average
2        FROM   answers a
3               JOIN users u
4                 ON u.id = a.user_id
5        WHERE  u.role IN ( 1, 2 ))
6        -
7        (SELECT Avg(a.answer) average
8         FROM   answers a
9                JOIN users u
10                  ON u.id = a.user_id
11         WHERE  u.role IN ( 3, 4 )) rozdil
SELECT (SELECT Avg(a.answer) average
        FROM   answers a
               JOIN users u
                 ON u.id = a.user_id
        WHERE  u.role IN ( 12 ))
        -
        (SELECT Avg(a.answer) average
         FROM   answers a
                JOIN users u
                  ON u.id = a.user_id
         WHERE  u.role IN ( 34 )) rozdil
Fury
Profil *
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
2        FROM   answers a
3               JOIN users u
4                 ON u.id = a.user_id
5        WHERE  u.role IN ( 1, 2 ))
6        GROUP BY a.type_id
SELECT Avg(a.answer) average
        FROM   answers a
               JOIN users u
                 ON u.id = a.user_id
        WHERE  u.role IN ( 12 ))
        GROUP BY a.type_id

Výsledky by tedy byly např:
1type_id      average
21             2,3847
32             2,9583
43             2,4758
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 *
1SELECT 
2  types.id,
3  t1.average - t2.average AS diff
4FROM
5  types
6  JOIN (
7    SELECT
8      AVG(a.answer) average
9    FROM  
10      answers a
11      JOIN users u ON u.id = a.user_id
12    WHERE  u.role IN ( 1, 2 )
13    GROUP BY 
14  ) t1 ON types.id = t1.type_id
15  JOIN (
16    SELECT
17      AVG(a.answer) average
18    FROM  
19      answers a
20      JOIN users u ON u.id = a.user_id
21    WHERE  u.role IN ( 3, 4 )
22    GROUP BY 
23  ) t2 ON types.id = t2.type_id
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 ( 12 )
    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 ( 34 )
    GROUP BY 
  ) t2 ON types.id = t2.type_id

Vymysli si, jaké chceš JOINy a případně ošetři null v average.
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