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
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
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
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
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
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.
Toto téma je uzamčeno. Odpověď nelze zaslat.