Avatar
Michal Kuba
Redaktor
Avatar
Michal Kuba:

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
Marek Z.
Redaktor
Avatar
Odpovídá na Michal Kuba
Marek Z.:

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
Redaktor
Avatar
Odpovídá na Marek Z.
Michal Kuba:

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

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
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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

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
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na Martin Konečný (pavelco1998)
Michal Kuba:

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:

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í
+1 bodů
Řešení problému
Nahoru Odpovědět  +3 24.9.2015 13:22
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Michal Kuba
Redaktor
Avatar
Odpovídá na TomasGlawaty
Michal Kuba:

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
Nahoru Odpovědět 25.9.2015 16:09
Člověk může dosáhnout čeho si zamane. Jen musí chtít, případně něco obětovat ...
Avatar
Martin Konečný (pavelco1998):

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

 
Nahoru Odpovědět 25.9.2015 17:04
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.