Diskuze: Pomoc s dotazem
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.


Zkus použít "OUTER JOIN", ten ti vrátí všechny výsledky i z tabulky, kde "není záznam"...
To mi fungovalo jen když jsem tam nedal tu podmínku WHERE, ale pak mi to vrátilo výsledky pro všechny uživatele. Každopádně už jsem našel řešení. Udělal jsem select všech levelů a pak i select všech progresů uživatele a výsledky jsem najoinoval právě outer joinem. Musely tam být dva selecty v jednom dotazu jinak mi to vracelo jen levely, u kterých měl uživatel nějaký progres
Musis to rozebrat na elementarni informace.
Ono, pojmenovani tabulek take neni stastne. Osobne davam jmena tak, k jake
hlavni tabulce se vazou. Pr
osoby, osoby_adresa, osoby_...
USERS(user_id,...)
USERS(id_user,...) -- nazev sloupce davam id, doplnujici informace je, ze je to
id_useri. Opacne pojmenovani mi prijde nelogicke. Chapu, chces rici, ze tabulka
osoby, sloupec id. Ale nelogice 
U tech ostatnich tabulek nemas uvedena indexy. Takze se z toho neda nic
vycarovat. Mozna tam zadne nemas
Kdyz se mi to nechce vypisovat, tak na forko pouzivam takovyto zapis.
Jenom se domnivam, ze by to melo vypadat nejak takto
USERS(id_user, data)
LEVELS(id_level, data nejake info)
user_level (id, id_user, id_level) -- vazebni, id nema vztah k jinemu id z jine tabulky, proto tam neni id_neco
user_PROGRESS(id, id_progress, id_user, id_level, id_phase, data)
PHASES(id_phase,...)
Pokud jsem to odhadl dobre, tak jedine, cemu nerozumim je starting_phase_fk. V user_PROGRESS uz jedenkrat id_level je. To bys musel asi vice objasnit fungovani level - progress - user
user_id level_id starting_phase_fk phase_fk
Vetsinu tech informaci mas v user_PROGRESS, takze, k ni asi budes vazat ostatni.
SELECT sloupce FROM user_PROGRESS LEFT JOIN user... LEFT JOIN levels, ... GROUP BY nebo neco, treba
U pojmenování tabulek a sloupců si jsem vědom, že to není ideální,
ale jsem na to zvyklý, tak to tak používám.
Sloupec starting_phase_fk byl cizí klíč na počáteční fázi úrovně
(abych věděl, kterou fází úroveň začíná), ale to je teď
nepodstatné.
Přidal jsem obrázek schéma osekané databáze jen na to nejnutnější.
Dotaz, který potřebuju by mi měl vráti seznam všech úrovní a pokud už
má uživatel v nějaké úrovni nějaký progres, tak se vrátí i id fáze, ve
které naposledy skončil. Pokud level ještě nehrál, tak vrátí místo id
fáze null.
Tabulka progres je řešena tak, že pokud uživatel nějaký level ještě
nehrál, tak tam neexistuje žádný záznam.
SELECT progress.user_iduser, level.idlevel, progress.phase_idphase FROM level
LEFT JOIN progress ON level.idlevel = progress.phase_level_idlevel
WHERE progress.user_iduser = 1
tohle mi vrací jenom levely, kde už má uživatel nějaký progres (joiny
jsem zkoušel všechny druhy)
db
Myslím, že jsi při tom zkoušení JOINů musel dělat něco špatně, protože LEFT OUTER JOIN nebo RIGHT OUTER JOIN na to musí fungovat...
Zkoušel jsem opravdu všechny (i ty které si myslím, že stejně mají stejný význam). Kromě JOINu jsem nechal dotaz tak, jak jsem ho uváděl naposledy. Podle mě tam dělá problém ta podmínka WHERE, protože když ji tam nedám, tak se to najoinuje tak jak bych potřeboval, ale jsou tam zase řádky s uživatelema, který nechci
Tak už jsem na to asi přišel
SELECT progress.user_iduser, level.idlevel, progress.phase_idphase FROM level
LEFT JOIN progress ON level.idlevel = progress.phase_level_idlevel AND progress.user_iduser = 1
Podmínka musela být v tom joinu a ne samostatně jako WHERE
Zobrazeno 8 zpráv z 8.