Autor Zpráva
Dersy
Profil *
Zdravím,

chtěl bych poprosit o radu, potřeboval bych vypsat z databáze všechny role, i když neobsahují žádný navázaný záznam:


select
    r.nazev,
    AVG(o.odpoved) prumer
from 
    odpovedi o 
join
    hodnotitele h 
        on h.id = o.hodnotitel_id
join 
    role r 
        on h.role = r.id
join 
    otazky ot 
        on ot.id = o.otazka_id
where 
    o.detail_id = 18
group by 
    h.role
)

Zkoušel jsem upravit u role "left outer join" a do where přidat "or h.role is null", ale bohužel mi to pořád vypisuje pouze role, které na sebe mají navázané nějaké záznamy. Netušíte prosím, jak je potřeba dotaz upravit?

Díky moc!
TomášK.
Profil *
Potřebuješ-li vypsat role, začni FROM role r. Přes LEFT JOIN napoj ostatní tabulky.
Dersy
Profil *
TomášK.:
To jsem zkoušel a vypisuje to stejné bohužel:

select
    r.nazev,
    AVG(o.odpoved) prumer
from 
    role r 
left join 
    hodnotitele h 
        on r.id = h.role
left join 
    odpovedi o  
        on h.id = o.hodnotitel_id
left join 
    otazky ot 
        on ot.id = o.otazka_id
where 
    o.detail_id = 18
group by 
    h.role
Alphard
Profil
Úplně do té struktury nevidím, ale není problém v té where části? Pokud na roli není přes hodnotitele navázaná odpověď, tak se tím = 18 vyřadí. V tom sloupci bude null, které můžete případně akceptovat doplnění OR větvě.
Dersy
Profil *
Alphard:
Úplne nerozumím, resp. nastává situace, kdy v tabulce hodnotitele jsou obsažený jen 3 role, přičemž v tabulce role jsou 4 záznamy, které potřebuji vypsat, i když nejsou v tabulce hodnotitele.

Zkoušel jsem přidávat do where "or h.role is null", ale to bohužel nepomáhá.
Kajman
Profil
Dersy:
Podmínku na o.detail_id dejte do left joinu. Groupujte podle role. Tabulku otazky asi není potřeba připojovat.

select
    r.nazev,
    AVG(o.odpoved) prumer
from 
    role r 
left join 
    hodnotitele h 
        on r.id = h.role
left join 
    odpovedi o  
        on h.id = o.hodnotitel_id and o.detail_id = 18
group by 
    r.id, r.nazev
Dersy
Profil *
Kajman:
Super, to je ono, díky moc! Akorát jsem narazil na druhý problém a to ve chvíli kdy chci přidat další podmínky, tzn. chci tam přidat např. ještě:
ot.kompetence_id = 1 and o.odpoved!= 0

Zkoušel jsem:
select
    r.nazev,
    AVG(o.odpoved) prumer
from 
    role r 
left join 
    hodnotitele h 
        on r.id = h.role
left join 
    odpovedi o  
        on h.id = o.hodnotitel_id and o.detail_id = 18 and o.odpoved!= 0
left join 
    otazky ot 
        on ot.id = o.otazka_id and ot.kompetence_id = 1  
group by 
    r.id, r.nazev

Ale vrací mi to bohužel jiné hodnoty než by mělo. Dá se to nějak vyřešit?

Ještě jednou díky za pomoc


Tady jsem ještě případně hodil strukturu DB s daty na db-fiddle: www.db-fiddle.com/f/mBQNyUbnwKFjP4JJDUDyyH/0
Kajman
Profil
Pokud chcete omezit odpovědi otázkami, tak tam už left join nepatří. Je potřeba to ozávorkovat, něco jako

SELECT r.nazev,
       Avg(o.odpoved) prumer
FROM   role r
       LEFT JOIN hodnotitele h
              ON r.id = h.role
       LEFT JOIN ( odpovedi o
                   JOIN otazky ot
                     ON ot.id = o.otazka_id
                        AND ot.kompetence_id = 1 )
              ON h.id = o.hodnotitel_id
                 AND o.detail_id = 18
                 AND o.odpoved != 0
GROUP  BY r.id,
          r.nazev
Kajman
Profil
Případně to celé přepsat na
from role left join (poddotaz se 3 inner joiny, který omezí odpovědi, klidně ve where)
aby to bylo čitelnější pro příští generace
Dersy
Profil *
Kajman:
Super, díky moc za pomoc, tohle je přesně co jsem potřeboval :).

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: