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.


Zobrazeno 8 zpráv z 8.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.