Autor Zpráva
forest
Profil *
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
Pokud k danému zápasu nenajde rozhodčího, bude příjmení NULL.
forest
Profil *
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
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 *
Díky, funguje.
forest
Profil *
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
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
případně mě někdo můžete smazat jako duplicitu, napsali jsme v podstatě totéž.
forest
Profil *
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0