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.
Tvůrce
Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.