Autor | Zpráva | ||
---|---|---|---|
Majkelju Profil |
#1 · Zasláno: 4. 7. 2012, 10:27:14
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 |
#2 · Zasláno: 4. 7. 2012, 10:32:39
SELECT * FROM stavby LEFT JOIN stavby_stupen ON stavby.id = stavby_stupen.k_stavba LEFT JOIN stupne ON tavby_stupen.k_stupen = stupne.id; |
||
juriad Profil |
#3 · Zasláno: 4. 7. 2012, 10:36:30
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 |
#4 · Zasláno: 4. 7. 2012, 10:45:43
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 |
#5 · Zasláno: 4. 7. 2012, 10:47:32
Majkelju:
Tak tam zkus na konec přidat ještě třeba LIMIT 100 .
|
||
Majkelju Profil |
#6 · Zasláno: 4. 7. 2012, 11:02:01
Keeehi: Nepomáhá... Fatal error: Call to a member function fetch_assoc() on a non-object
|
||
Keeehi Profil |
#7 · Zasláno: 4. 7. 2012, 11:21:26
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 |
#8 · Zasláno: 4. 7. 2012, 11:33:23
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 |
#11 · Zasláno: 4. 7. 2012, 13:45:18
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 |
#13 · Zasláno: 4. 7. 2012, 15:11:19
Děkuji všem za pomoc! Udělal jsem to podle Keeehiho a jede to přesně, jak jsem chtěl :)
|
||
Časová prodleva: 12 let
|
0