Diskuze: SQL dotaz pro získání nesplněných hlasování
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Ahoj, můžeš zkusit něco takovýho, psal jsem to z hlavy, takže nevím, jestli to bude úplně OK.
SELECT * FROM event
INNER JOIN user_events ON user_events.event_id = event.id
INNER JOIN user ON user_events.user_id = user.id
LEFT JOIN pool_option ON pool_option.event_id = event.id
LEFT JOIN vote ON vote.pool_option_id = pool_option.id
WHERE pool_option.id NOT IN (
SELECT id
FROM pool_option
WHERE user_id = user.id
)
V podstatě vybírám všechny eventy, které jsou sdílené s uživatelem (ty první dva INNER joiny), pak nezávisle na tom připojuji hlasování (dva LEFT joiny) a omezím záznamy hlasování podle té podmínky WHERE NOT IN, ve kterém vyberu hlasování, které již uživatel dal.
Nejsem si z hlavy jistý, jestli to s těmi LEFT bude fungovat a zda by
místo nich taktéž neměl být INNER, ale nejsem si jistý, jak by se to
popralo s těmi prvními dvěma joiny
Děkuji. Bohužel dotaz nefunguje.
Když jsem zkusil přímo tvůj kod, tak mi píše, že used_id ve WHERE je
dvojznačký.
Poté jsem změnil tu WHERE část takto:
SELECT * FROM event
INNER JOIN users_events ON users_events.event_id = event.id
INNER JOIN user ON users_events.user_id = user.id
LEFT JOIN pool_option ON pool_option.event_id = event.id
LEFT JOIN vote ON vote.pool_option_id = pool_option.id
WHERE pool_option.id NOT IN (
SELECT po.id
FROM pool_option po
join vote ON vote.pool_option_id = po.id
WHERE vote.user_id = 4
)
To sice nevyhodí chybu, ale nevrací mi to vůbec nic (ačkoli by mělo).
Ne, tak se omlouvám. Jsem neměl testovací data v té tabulce
users_events.
Nicméně ten můj sql dotaz samozřejmě nevyhodí eventy, které uživatel
neviděl, ale spíše něco, co uživatel nevolil (tedy tu druhou možnost ,než
volil). Ale nevrátí mi to jeho nevolené eventy.
Pokud to píše, že nějaký sloupec je "ambigous", pak by mělo stačit si
jen u některé tabulky udělat alias.
Nešlo by to s tím WHERE takhle?
WHERE pool_option.id NOT IN (
SELECT po.id
FROM pool_option po
WHERE po.user_id = user.id
)
Případně pokud to není chyba v tom WHERE, ale v SELECT, můžeš pro zkoušku napsat
SELECT event.* FROM event
Problém je, že v té tabulce pool_option nemám to user_id... čili tam se
ta where musí udělat jinak
SELECT * FROM event
INNER JOIN users_events ON users_events.event_id = event.id
INNER JOIN user ON users_events.user_id = 4
LEFT JOIN pool_option ON pool_option.event_id = event.id
LEFT JOIN vote ON vote.pool_option_id = pool_option.id
WHERE pool_option.id NOT IN (
SELECT po.id
FROM pool_option po
JOIN vote v ON po.id = v.pool_option_id
WHERE v.user_id = 4
)
;
udělal jsem to takhle, ale vyhazuje to prostě všechny varianty, které ten daný uživatel nevolil.
Jasné, promiň, jsem se trošku zamotal a zapomněl, že v pool_option to
user_id není Nicméně s
tím JOINem v subselectu se mi to zdá OK.
Zadání je: "Potřebuji získat všechny eventy, které daný uživatel
ještě neviděl (respektive nevolil)"
A tento SQL dotaz vrací nejen eventy, ale všechny varianty hlasování?
Pokud ano, můžeš zkusit ještě GROUP BY event.id nebo tak něco, aby se to
seskupilo dle těch eventů.
Díky, vypadá to, že následující SQL dotaz je funkční
SELECT * FROM event
INNER JOIN users_events ON users_events.event_id = event.id
INNER JOIN user ON users_events.user_id = 4
LEFT JOIN pool_option ON pool_option.event_id = event.id
LEFT JOIN vote ON vote.pool_option_id = pool_option.id
GROUP BY event.id
HAVING vote.id is null
;
Zkoušel jsem to jen na rychlo a vypadá to nadějně. Zkusím to potom
později pořádně, jestli to funguje, ale vypadá to, že jo
Díky za pomoc
Zobrazeno 8 zpráv z 8.