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.

Č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.
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.