Autor | Zpráva | ||
---|---|---|---|
Musilda Profil |
Zdravím
Mám otázku. Mám dva dotazy //Vybereme body a id uživatele dle vybrané soutěže a srovnáme dle počtu bodů $dotaz=mysql_query("SELECT id_user, body FROM body_kolo_hlavni WHERE soutez='".$sou."' ORDER BY body DESC"); while($vysledek=mysql_fetch_array($dotaz)): //Ke každému id_user přiřadíme záznamy $sql=mysql_query("SELECT nick, e_mail, jmeno, prijmeni FROM users WHERE id='".$vysledek['id_user']."'"); $result=mysql_fetch_array($sql); //Tady vypíšu záznamy endwhile; Protože spojování tabulek mi moc nejde, chtěl bych poradit, zda jdou tyto dva dotazy spojit a jak to funguje. Mám matnou představu o LEFT JOIN. Moc děkuji |
||
TomášK Profil |
#2 · Zasláno: 15. 6. 2009, 18:49:23 · Upravil/a: TomášK
Jak to funguje zjistíš třeba tu:
http://php.vrana.cz/spojovani-tabulek.php nebo tu: http://www.root.cz/clanky/leftright-outer-inner-join-v-sql/ Přečtení aspoň jednoho z těch článků by mělo postačit k tomu, abys to dal dohromady |
||
Musilda Profil |
#3 · Zasláno: 15. 6. 2009, 19:01:37
Hmm. Tak jsem tam kde jsem byl.
Oba články znám. Dokonce i dokážu zopakovat co tam je napsané. Ale chybí mi takový ten záblesk poznání. Něco jako: tohle je tam proto a proto. Ale děkuji za snahu poradit. |
||
nightfish Profil |
#4 · Zasláno: 15. 6. 2009, 19:12:22
SELECT id_user, body, nick, e_mail, jmeno, prijmeni FROM body_kolo_hlavni JOIN users on id_user = users.id WHERE soutez = '$sou' ORDER BY body DESC |
||
TomášK Profil |
#5 · Zasláno: 15. 6. 2009, 19:30:43 · Upravil/a: TomášK
Zkusím to ještě jednou na příkladu konkrétních dat:
Použiju vaše dvě tabulky body (abych nemusel vypisovat body_kolo_hlavni) a users (btw stálo by za to sjednotit jazyk - vše česky nebo vše anglicky). Zánamy - uživatelé: 1, Tomáš 2, Franta 3, Honza Zánamy - body (id_user, body): 1, 10 1, 20 2, 15 3, 25 A teď dotazy: SELECT * FROM uzivatele, body vrátí všechny možné dvojice záznamů - bez ohledu na nějakou vazbu. 1, Tomáš - 1, 10 1, Tomáš - 1, 20 1, Tomáš - 2, 15 1, Tomáš - 3, 25 2, Franta -1, 10 2, Franta -1, 20 2, Franta -2, 15 2, Franta -3, 25 3, Honza - 1, 10 3, Honza - 1, 20 3, Honza - 2, 15 3, Honza - 3, 25 Ale my nechceme všechny dvojice, ale jenom ty , které mají stejné id a id_user: SELECT * FROM users, body WHERE users.id = body.user_id což jde zapsat ještě jiným způsobem - ale je to totéž, jen o něco přehlednější syntaxe: SELECT * FROM users JOIN body ON users.id = body.user_id 1, Tomáš - 1, 10 1, Tomáš - 1, 20 2, Franta -2, 15 3, Honza - 1, 10 3, Honza - 3, 25 A přesně tohle jsme z toho chtěli dostat - jsme u cíle. INNER vs OUTER a LEFT vs RIGHT říkají jak se chovat, pokud se k nějakému id nenajde kamarád - záznam z druhé tabulky se stejným id. Zde náš stačí JOIN (pro MySQL implicitně převede na INNER JOIN). Pokud bychom měli v tabulce i uživatele (4, Josef), který nemá žádné body, a chtěli ho mít ve výsledku, pak musíme použít LEFT JOIN a do dvojice s ním se přidá záznam, který bude mít všude NULL. |
||
Musilda Profil |
#6 · Zasláno: 15. 6. 2009, 19:56:47
Perfektní, přesně takto jsem to po lopatě potřeboval. Hlavně na databázi, kterou znám. Naprosto super. Moc děkuju.
A k mému minulému dotazu, kde jsi mi psal, že ten zásah do databáze nevypadá na SQL injection, tak jsi měl pravdu. Měl jsem formulář pro výpis zápasů a když už byl odehrán, tak se ve formuláři nevypsal. Respektive nešel odeslat. Chytráci přišli na to, že když si otevřou formulář (pro každý tip jedno okno) a nechají ho otevřený, tak po odehrání zápasu odešlou správný tip. Docela jsem na to koukal. Ale už jsem to opravil. Jinak ještě jednou díky. |
||
Časová prodleva: 15 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0