Autor | Zpráva | ||
---|---|---|---|
Dersy Profil * |
#1 · Zasláno: 13. 12. 2017, 09:26:48
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 * |
#2 · Zasláno: 13. 12. 2017, 11:13:02
Potřebuješ-li vypsat role, začni
FROM role r . Přes LEFT JOIN napoj ostatní tabulky.
|
||
Dersy Profil * |
#3 · Zasláno: 13. 12. 2017, 11:26:08
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 * |
#5 · Zasláno: 13. 12. 2017, 12:58:59
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 |
#8 · Zasláno: 13. 12. 2017, 14:25:43
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 |
#9 · Zasláno: 13. 12. 2017, 14:29:53
Případně to celé přepsat na
from role left join (poddotaz se 3 inner joiny, který omezí odpovědi, klidně ve where) |
||
Dersy Profil * |
#10 · Zasláno: 13. 12. 2017, 15:08:59
Kajman:
Super, díky moc za pomoc, tohle je přesně co jsem potřeboval :). |
||
Časová prodleva: 7 let
|
0