tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

MySQL a vícenásobný JOIN

před 11 lety

Domo
Člen | 2

On je to spíš dotaz na samotné MySQL, ale pohybuje se zde dost programátorských guru než kdekoliv jinde, tak se ptám tady.

Mám tabulky:

tymy:

|-----|------------------------|
| id  | nazev                  |
|-----|------------------------|
| nas | Nashville Predators    |
| buf | Buffalo Sabres         |
| phi | Philadelphia Flyers    |
|-----|------------------------|

zapasy:

|-----|-----------|---------|
| id  | domaci_id | host_id |
|-----|-----------|---------|
| 1   | nas       | phi     |
| 2   | buf       | phi     |
| 3   | nas       | buf     |
| 4   | edm       | phi     |
|-----|-----------|---------|

A pomocí dotazu chci asociovat zároveň tým domácí i hostující. Identifikátory v jednom zápase nemohou být shodné.

Takže vracet něco jako:

|-----|-----------|---------|---------------------|---------------------|
| id  | domaci_id | host_id | domaci_nazev        | host_nazev          |
|-----|-----------|---------|---------------------|---------------------|
| 1   | nas       | phi     | Nashville Predators | Philadelphia Flyers |
| 2   | buf       | phi     | Buffalo Sabres      | Philadelphia Flyers |
| 3   | nas       | buf     | Nashville Predators | Buffalo Sabres      |
| 4   | edm       | phi     | NULL                | Philadelphia Flyers |
|-----|-----------|---------|---------------------|---------------------|

Zatím jsem schopen pomocí LEFT JOIN dosadit jen domácí tým, což mi nestačí. Dříve jsem to řešil pomocí vybrání všech týmů do assoc pole a přiřazování na úrovni PHP.

Budu rád za každou pomoc!

Edit:

Asociaci domácího týmu provádím zatím takto:

$zapasy = dibi::query ("
            SELECT
                [z].[domaci_id],
                [z].[host_id],
                [t].[nazev] AS [domaci_nazev]
            FROM
                [zapasy] AS [z]
            LEFT JOIN
                [tymy] AS [t] ON ([z].[domaci_id]=[t].[id])
            ORDER BY
                [kolo] DESC
");

Editoval Domo (17. 11. 2008 15:38)

před 11 lety

blacksun
Člen | 181
<?php

$zapasy = dibi::query ("
                        SELECT
                                [z].[domaci_id],
                                [z].[host_id],
                                [td].[nazev] AS [domaci_nazev]
                                [th].[nazev] AS [hoste_nazev],
                        FROM
                                [zapasy] AS [z]
                        LEFT JOIN
                                [tymy] AS [td] ON ([z].[domaci_id]=[t].[id])
                        LEFT JOIN
                                [tymy] AS [th] ON ([z].[host_id]=[t].[id])
                        ORDER BY
                                [kolo] DESC
");
?>

před 11 lety

Domo
Člen | 2

No, to je ono. Díky za pomoc! Pomohli ty aliasy td a th.

SELECT
        [z].[domaci_id],
        [z].[host_id],
        [td].[nazev] AS [domaci_nazev],
        [th].[nazev] AS [hoste_nazev]
FROM
        [zapasy] AS [z]
LEFT JOIN
        [tymy] AS [td] ON ([z].[domaci_id]=[td].[id])
LEFT JOIN
        [tymy] AS [th] ON ([z].[host_id]=[th].[id])
ORDER BY
        [kolo] DESC