Diskuze: Tahání čísel z ID a vracení a znovu tahání
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 11 zpráv z 11.
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í PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Chápu to tedy dobře tak, že prvně se dotazuješ na mise uživatele a poté chceš vypsat přijaté (ze stejné tabulky?), či?
Nejdřív vytahuju z tabulky mojeMise ty řádky, ve kterých je ve sloupci uzivatel stejné číslo jako v SESSION ID, poté chci z vybraných záznamů vzít čísla ze sloupce mise a poslat dotaz na tabulku mise a vytáhnout ty, jejichž ID jsou stejné s těmi, co přišli.
Prostě chci zobrazit každému uživateli (bude jich řádově do desíti) jejich mise, které předtím přijali.
zdar, máš dvě možnosti:
SELECT data FROM mise
WHERE id IN (1, 2, 4, 10, 20, ...)
To jde v podstatě řešit subdotazem:
SELECT data FROM mise
WHERE id IN (
SELECT mise_id
FROM moje_mise
WHERE uzivatel_id = :uzivatelId
)
SELECT mise.* FROM mise
INNER JOIN moje_mise ON mojeMise.mise_id = mise.id
WHERE moje_mise.uzivatel_id = :idUzivatele
Kdybys mi dal strukturu tabulek, dokázal bych ti to napsat přesněji
Tabulka mojeMise má strukturu:
ID(int11)
mise(int11)
uzivatel(int11)
prijato(timestamp)
dokonceno(int11)->0 nebo 1
a potom je ta tabulka s misemi:
ID int(11)
titulek varchar(40)
text varchar(350)
pridano timestamp
exp int(11)
active int(11)->0 nebo 1
S tím že tedy musím ošetřit to, že někdo má misi jednu a někdo taky
padesát. Mrknu se na to asi až večer až budu mít čas, ale když budu mít
ještě nějakou radu tak budu rád 
Díkec
A může mít více uživatelů jednu misi? Pokud ne, mohl bys to ID
uživatele hodit přímo do tabulky mise.
Jinak by tvůj dotaz na vyhledání těch misí byl relativně easy
SELECT * FROM mise
WHERE id IN (
SELECT mise FROM mojeMise
WHERE uzivatel = :uzivatelId
)
Nebo to řešení přes JOIN
edit: asi budeš chtít hledat data v obou tabulkách, vid? V tom případě bych použil
SELECT mise.titulek, mise.text, ..., mojeMise.prijato, mojeMise.dokonceno, ...
FROM mise
INNER JOIN mojeMise ON mojeMise.mise = mise.id
WHERE mojeMise.uzivatel = :uzivatelId
za :uzivatelId si pochopitelně dosadíš ID uživatele ze session.
To jsem možná nezmínil - počítám s tím, že jednu misi bude mít vždy více jak jeden uživatel.
Hele, moc se v tom jak to máš nevyznám, ale napíšu ti to tak jak to bývá asi nejčastěji:
Tabulka 'user' (píšu jen to nejdůležitější):
id => int(11) AI
name ...
Tabulka 'mission':
id => int(11) AI
name, text ...
Tabulka 'user_mission':
id => int(11) AI
id_user => int(11)
id_mission => int(11)
V tabulce 'user' jsou všichni uživatelé (jak jinak
), v tabulce 'mission' jsou uplně
všechny mise co existujou a tabulka 'user_mission' je propojovací tabulka mezi
uživateli a misemi.
Takže například když bude nějaký uživatel s ID 5 mít nějaké 3 mise
(např. s ID 1,4,6) tak v tabulce 'user_mission' bude uloženo toto:
| id | id_user | id_mission |
| 1 | 5 | 1 |
| 2 | 5 | 4 |
| 3 | 5 | 6 |
A teď záleží co chceš tahat z DB, ale hádám, že budeš chtít data o jednotlivých misích, které má uživatel.
SELECT mission.name, mission.title, mission.text
FROM user_mission
JOIN mission
ON user_mission.id_mission = mission.id
WHERE user_mission.id_user = ?
Snad je to dobře, píšu to z hlavy.
? => id uživate ze session.
Když budeš chtít uživateli nějakou misi odstranit (např. je splněná), tak smažeš akorát jeden záznam z tabulky 'user_mission' - tímto zanikne relace mezi daným uživatelem a danou misí.
A ještě drobnost, když do nějakého sloupce ukládáš pouze 0/1, tak je zbytečné používat datový typ int(11), ale použil bych například TINYINT(1).
Díky moc, dobrá práce
Nevím proč mě nenapadlo to nacpat do jednoho dotazu, je to tak snazší 
... neb přesně jak jsem to popisoval 
Zobrazeno 11 zpráv z 11.