Autor | Zpráva | ||
---|---|---|---|
forest Profil * |
#1 · Zasláno: 14. 1. 2014, 10:26:24
Mám tabulku ZAPASY a v ní je sloupec ID_ROZHODCI. Dále mám tabulku UZIVATELE ve které jsou sloupce ID_UZIVATEL(shodne s ID_ROZHODCI), PRIJMENI
Potřebuji vypsat zapasy s příslušnými rozhodčími: SELECT z.id_zapas AS id_zapas, u.prijmeni AS prijmeni FROM zapasy z, uzivatele u WHERE z.id_rozhodci = u.id_uzivatel Vše takto funguje, do doby než chci vypsat i zápasy ve kterých ještě nebyl přidělen rozhodčí, tzn. v tabulce ZAPASY ve sloupci ID_ROZHODCI je 0. - datový typ tohoto sloupce je INT. Chápu proč to nefunguje když mám ve WHERE aby se to ID_ROZHODCI rovnalo s ID_UZIVATEL a tudíž, když mám 0 tak se nerovná a příslušný zápas to nevypíše. Proto dotaz z ní ja změnit dotaz, aby to vypsalo i zápasy kde není rozhodčí přidělen? Naadá mě vložit nějakou podmínku, ale nevm jak na to. Předem díky. |
||
Tori Profil |
SELECT z.id_zapas AS id_zapas, u.prijmeni AS prijmeni FROM zapasy z LEFT JOIN uzivatele u ON z.id_rozhodci = u.id_uzivatel |
||
forest Profil * |
#3 · Zasláno: 14. 1. 2014, 10:35:32
Díky a mohu poprosit ještě o řešení s tím WHERE. Mám totiž tento dotaz v reálu výrazně složitější a JOIN zatím neumím používat ve složitějších dotazech. Takže bych to asi nezvládl přepsat..
|
||
Kajman Profil |
#4 · Zasláno: 14. 1. 2014, 10:50:15
forest:
„JOIN zatím neumím používat“ JOIN používáte, kontrétkně CROSS JOIN zapsaný čárkou mezi tabulkami. V CROSS JOINu chtěné vlastnosti nedocílíte, použijte zmíněný LEFT JOIN. |
||
forest Profil * |
#5 · Zasláno: 14. 1. 2014, 11:10:42
Díky, funguje.
|
||
forest Profil * |
#6 · Zasláno: 14. 1. 2014, 21:00:01
Tak nakonec jsem nedokázal přepsat tento dotaz za použití LEFT JOIN. Jednodušší jsem zvládnul, ale tady nevím jak na to, tak prosím o radu.. Díky
SELECT r.number_round AS kolo, c.name_competition AS soutez, m.id_match AS id_match, t1.name_team AS domaci, t2.name_team AS hoste, t1.short_name_team AS domaci_kratke, t2.short_name_team AS hoste_kratke, s.annual AS rocnik, s.start_season AS s_start, s.end_season AS s_end, h.hall_name AS hall_name, ref1.surname AS ref_sur1, ref2.surname AS ref_sur2, m.forfeit, m.id_referee_2 AS exist_ref2, m.match_view, m.id_referee_1 AS exist_ref1, m.id_hall AS exist_hall, m.hgoal AS hgoal, m.agoal AS agoal, m.status AS status, date_format(r.start_round, '%d. %m. %Y') AS start_r, date_format(r.end_round, '%d. %m. %Y') AS end_r, date_format(m.date_match, '%d. %m. %Y') AS date_match, date_format(m.time_match, '%H:%i') AS time_match FROM matches AS m, teams AS t1, teams AS t2, rounds AS r, competitions AS c, seasons AS s, halls AS h, users AS ref1, users AS ref2 WHERE m.id_team_h = t1.id_team AND m.id_team_a = t2.id_team AND m.id_hall = h.id_hall AND m.id_referee_1 = ref1.id_user AND m.id_referee_2 = ref2.id_user AND m.id_round = r.id_round AND r.id_competition = c.id_competition AND c.id_competition = '$competition' AND m.id_round = '$round' ORDER BY m.date_match = '00-00-0000' ASC, m.date_match ASC, m.time_match ASC |
||
juriad Profil |
#7 · Zasláno: 14. 1. 2014, 21:14:43
SELECT r.number_round AS kolo, c.name_competition AS soutez, m.id_match AS id_match, t1.name_team AS domaci, t2.name_team AS hoste, t1.short_name_team AS domaci_kratke, t2.short_name_team AS hoste_kratke, s.annual AS rocnik, s.start_season AS s_start, s.end_season AS s_end, h.hall_name AS hall_name, ref1.surname AS ref_sur1, ref2.surname AS ref_sur2, m.forfeit, m.id_referee_2 AS exist_ref2, m.match_view, m.id_referee_1 AS exist_ref1, m.id_hall AS exist_hall, m.hgoal AS hgoal, m.agoal AS agoal, m.status AS status, date_format(r.start_round, '%d. %m. %Y') AS start_r, date_format(r.end_round, '%d. %m. %Y') AS end_r, date_format(m.date_match, '%d. %m. %Y') AS date_match, date_format(m.time_match, '%H:%i') AS time_match FROM matches AS m, seasons AS s # nejspíš tam máš chybu, tabulka seasons není provázaná žádnou podmínkou JOIN teams AS t1 ON m.id_team_h = t1.id_team JOIN teams AS t2 ON m.id_team_a = t2.id_team JOIN halls AS h ON m.id_hall = h.id_hall LEFT JOIN users AS ref1 ON m.id_referee_1 = ref1.id_user LEFT JOIN users AS ref2 ON m.id_referee_2 = ref2.id_user JOIN rounds AS r ON m.id_round = r.id_round JOIN competitions AS c ON r.id_competition = c.id_competition WHERE c.id_competition = '$competition' # ve where jsou jen podmínky zvnějšku AND m.id_round = '$round' ORDER BY m.date_match = '00-00-0000' ASC, m.date_match ASC, m.time_match ASC |
||
Tori Profil |
Tohle je tentýž dotaz, jen CROSS JOINy jsou zapsané s tímto klíč. slovem, a podmínky spojování tabulek nejsou ve WHERE ale u spojení tabulek (kde mají logicky být). Jediné, co patří do WHERE je podmínka, kterou vybíráte, které záznamy chcete. Zároveň je hned vidět, že nemáte nastavené, na základě jakého společného sloupce se má připojit tabulka seasons. Každopádně ten LEFT JOIN se tam už změní snadněji.
SELECT r.number_round AS kolo, c.name_competition AS soutez, m.id_match AS id_match, t1.name_team AS domaci, t2.name_team AS hoste, t1.short_name_team AS domaci_kratke, t2.short_name_team AS hoste_kratke, s.annual AS rocnik, s.start_season AS s_start, s.end_season AS s_end, h.hall_name AS hall_name, ref1.surname AS ref_sur1, ref2.surname AS ref_sur2, m.forfeit, m.id_referee_2 AS exist_ref2, m.match_view, m.id_referee_1 AS exist_ref1, m.id_hall AS exist_hall, m.hgoal AS hgoal, m.agoal AS agoal, m.status AS status, date_format(r.start_round, '%d. %m. %Y') AS start_r, date_format(r.end_round, '%d. %m. %Y') AS end_r, date_format(m.date_match, '%d. %m. %Y') AS date_match, date_format(m.time_match, '%H:%i') AS time_match FROM matches AS m CROSS JOIN teams AS t1 ON m.id_team_h = t1.id_team CROSS JOIN teams AS t2 ON m.id_team_a = t2.id_team CROSS JOIN rounds AS r ON m.id_round = r.id_round CROSS JOIN competitions AS c ON r.id_competition = c.id_competition AND c.id_competition = '$competition' CROSS JOIN seasons AS s CROSS JOIN halls AS h ON m.id_hall = h.id_hall CROSS JOIN users AS ref1 ON m.id_referee_1 = ref1.id_user CROSS JOIN users AS ref2 m.id_referee_2 = ref2.id_user WHERE m.id_round = '$round' ORDER BY m.date_match = '00-00-0000' ASC, m.date_match ASC, m.time_match ASC |
||
forest Profil * |
#9 · Zasláno: 14. 1. 2014, 21:33:33
Supr díky!
Jen pro doplnění: juriad: Tento dotaz vypisuje: #1054 - Unknown column 'm.id_team_h' in 'on clause' Tori: Zde jen chybělo u posledního CROSS JOIN dopsat "ON" a vše funguje s doplněním LEFT JOIN. Ještě díky za objevení chyby s nepřipojením tabulky seasons. |
||
Časová prodleva: 10 let
|
0