Autor Zpráva
Majkelju
Profil
Dobrý den,

mám za úkol vypsat data z MySQL databáze.
Zde jsou podstatné tabulky a jejich sloupce:
stavby - id, znacka, nazev, k_vlastnik
stvby_stupen - id, k_stavba, k_stupen, znacka, nazev
stupne - id, poradi, znacka, nazev

Přičemž "k_" atributy jsou vždy klíčem k cizím tabulkám

Požadavek je takový, že se do jedné tabulky mají vypsat všechny stavby, uložené v db (jejich značka a název), a ke každé stavbě pak její stupně (každá stavba může mít jeden až čtyři stupně) .... Mohl by mě někdo vysvětlit, jak to udělat? Jsem čerstvý nováček v mySQL a tohle se ukázalo být pro mě neřešitelným problémem....
Keeehi
Profil
SELECT * FROM stavby LEFT JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba LEFT JOIN stupne ON tavby_stupen.k_stupen = stupne.id;
Zkuste si to spustit v nějakém programu na práci s databázemi (adminer, phpMyAdmin) ať vidíte, jaká tabulka z toho leze.
juriad
Profil
SELECT a.znacka, a.nazev, c.znacka, c.nazev FROM stavby as a JOIN stvby_stupen as b ON a.id = b.k_stavba JOIN stupne as c ON b.k_stupen = c.id

není mi úplně jasné, které značky a názvy chceš
Majkelju
Profil
Keeehi: Hází to nějakou chybu Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 84720 bytes) ....
juriad: Značku a název stavby, k nim pak ke každé stavbě značky těch stupňů....jdu ozkoušet tvoji verzi zatím....
Keeehi
Profil
Majkelju:
Tak tam zkus na konec přidat ještě třeba LIMIT 100.
Majkelju
Profil
Keeehi: Nepomáhá... Fatal error: Call to a member function fetch_assoc() on a non-object
Keeehi
Profil
Majkelju:
Fatal error: Call to a member function fetch_assoc() on a non-object
Toto by snad s dotazem nemělo mít nic společného. Toto je chyba v PHP. Zkuste ten dotaz spustit v admineru.
Majkelju
Profil
Keeehi: MyPhpAdmin píše: #1052 - Column 'znacka' in field list is ambiguous
Keeehi
Profil
Majkelju:
Máte ve dvou tabulkách sloupec se stejným jménem a mysql neví, co máte na mysli. Musíte určit, ze které tabulky se ten sloupce má brát jmeno_tabulky.znacka
Majkelju
Profil
Keeehi: Pravda! :) Už jsem to opravil, trochu upravil a už to skoro jede... Jenom to tedy vypíše třeba 4 řádky se stejnou stavbou, přičemž na každém řádku má jiný stupeň.... Potřeboval bych, aby se od každé stavby zobrazil jen jeden řádek s nejvyšším stupněm. Napadlo mě přidat tam GROUP BY, ale už nevím, jak mu říct, aby vybral nejvyšší stupeň od každé stavby..
Dotaz tedy v podstatě vypadá takto, jak jste mi poradil (řádku s default si nevšímejte, to je jen takový malý filtr):
SELECT stavby.znacka, stavby.nazev, stavby_stupen.k_stupen
FROM stavby
LEFT JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba
LEFT JOIN stupne ON stavby_stupen.k_stupen = stupne.id
WHERE stavby_stupen.default=1
ORDER BY stavby.nazev ASC
juriad
Profil
SELECT stavby.znacka, stavby.nazev, stavby_stupen.k_stupen
FROM
(
    SELECT stavby.id, max(stupne.nazev) AS max -- proste to co rika, ze je stupen nejvetsi
    FROM stavby
    JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba
    JOIN stupne ON stavby_stupen.k_stupen = stupne.id
    GROUP BY stavby.id
) AS x 
JOIN stavby ON x.id = stavby.id
JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba
JOIN stupne ON stavby_stupen.k_stupen = stupne.id AND stupne.nazev = x.max

vnitřní select ti vrátí ke každé stavbě nejvyšší stupeň (jeho výšku, tady je výška nazev)
venku to projoinuješ se stejným dotazem

LEFT JOIN je podle mě zbytečný
a proboha používej aliasy, je peklo psát celý název tabulky
Keeehi
Profil
Majkelju:
ale už nevím, jak mu říct, aby vybral nejvyšší stupeň od každé stavby.
Funkce MAX() to zjistí.
SELECT stavby.znacka, stavby.nazev, MAX(stavby_stupen.k_stupen)
FROM stavby
LEFT JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba
LEFT JOIN stupne ON stavby_stupen.k_stupen = stupne.id
WHERE stavby_stupen.default=1
GROUP BY stavby.nazev
ORDER BY stavby.nazev ASC
Majkelju
Profil
Děkuji všem za pomoc! Udělal jsem to podle Keeehiho a jede to přesně, jak jsem chtěl :)

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