NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s podporou uplatnění od 0 Kč. Více informací.

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.

Aktivity
Avatar
Michal Kuba
Tvůrce
Avatar
Michal Kuba:23.9.2015 22:42

Ahoj.
Už ten název zní šíleně a je možná dost nevypovídající. Upřesním:

Z databáze z jedné tabulky vytahuji ty řádky, u kterých je číslo ve sloupci uživatel stejné tomu v SESSION (prostě se mají zobrazovat každému jeho přijaté mise podle ID)

$mojeMise=$spravceUzivatelu->vyberMojeMise($_SESSION['uzivatel']['ID']);

Správně se vrátí pole s polemi a v každém poli jsou vypsané veškeré potřebné informace. V dalším kroce potřebuji vytáhnout čísla ze sloupců "mise" (to znamená ID přijatých misí) a tato čísla poslat znovu do správce a vytáhnout vše o těch misích, jejichž ID se rovná těm vybraným ID misí před chvílí, které má uživatel přijaté.

Je to srozumitelné?
Jak to mám teda reálně udělat, abych všechna čísla vytažená napoprvé postupně poslal do metody, která vytáhne mise, které jsou v tabulce přijatých misí? Nějaký foreach? Nebo to tahat nějak jinak?

Až potom ošetřím to, aby se vytáhlo vždy jen jedenkrát každé ID mise (aby se mise nevypsala nějak omylem vícekrát, i když by to tak nemělo dopadnout).

Díky každému předem :)

 
Odpovědět
23.9.2015 22:42
Avatar
Odpovídá na Michal Kuba
Uživatel sítě :23.9.2015 22:57

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?

Nahoru Odpovědět
23.9.2015 22:57
Chybami se člověk učí, běžte se učit jinam!
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Uživatel sítě
Michal Kuba:24.9.2015 11:09

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.

 
Nahoru Odpovědět
24.9.2015 11:09
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):24.9.2015 11:23

zdar, máš dvě možnosti:

  1. vytahat ID těch misí a poté je hodit do druhého dotazu pomocí operátoru IN(), kdy ti pak vznikne dotaz
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
)
  1. použít JOIN
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

Editováno 24.9.2015 11:25
Nahoru Odpovědět
24.9.2015 11:23
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:24.9.2015 11:28

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

 
Nahoru Odpovědět
24.9.2015 11:28
Avatar
Odpovídá na Michal Kuba
Martin Konečný (pavelco1998):24.9.2015 11:31

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.

Editováno 24.9.2015 11:33
Nahoru Odpovědět
24.9.2015 11:31
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:24.9.2015 11:37

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.

 
Nahoru Odpovědět
24.9.2015 11:37
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Michal Kuba
TomasGlawaty:24.9.2015 13:22

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

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
24.9.2015 13:22
Avatar
Michal Kuba
Tvůrce
Avatar
Odpovídá na TomasGlawaty
Michal Kuba:25.9.2015 9:27

Díky moc, dobrá práce :) Nevím proč mě nenapadlo to nacpat do jednoho dotazu, je to tak snazší :)

 
Nahoru Odpovědět
25.9.2015 9:27
Avatar
TomasGlawaty
Člen
Avatar
Odpovídá na Michal Kuba
TomasGlawaty:25.9.2015 16:09

Jasně, naní zač :)

 
Nahoru Odpovědět
25.9.2015 16:09
Avatar
Martin Konečný (pavelco1998):25.9.2015 17:04

... neb přesně jak jsem to popisoval :D

Nahoru Odpovědět
25.9.2015 17:04
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.