Autor | Zpráva | ||
---|---|---|---|
Milanov Profil * |
#1 · Zasláno: 16. 7. 2008, 15:00:35
Zdravím. Mám spoustu tabulek ("zavody", "druzstva", "vysledky",...) a k nim tabulku "komentare", která obsahuje sloupce "cislo_radku" a "nazev_tabulky". Potřeboval bych projít všechny komentáře a ke každému vypsat název družstva, závodu,..., ke kterému se vztahují. Můj kód:
SELECT komentare.*, (SELECT nazev_tabulky FROM komentare WHERE id = komentare.id).nazev FROM komentare LEFT JOIN (SELECT nazev_tabulky FROM komentare WHERE id = komentare.id) ON (SELECT nazev_tabulky FROM komentare WHERE id = komentare.id).id = komentare.id_radku Podle očekávání nefunguje, nevěděl byste někdo, jak to vyřešit? Díky |
||
pmg Profil |
#2 · Zasláno: 16. 7. 2008, 15:47:27 · Upravil/a: pmg
Struktura databáze, kde je ve sloupci uložen název tabulky, je dost problematická. Pokud už se tomu nelze vyhnout, doporučil bych to řešit na aplikační úrovni.
Kdysi se mi problém podařilo obejít dynamickým sestavením dotazu v proceduře. Objeví se ale další problémy. Aby bylo možné z procedury získat větší množství řádků, je potřeba ji volat funkcí mysqli_multi_query; první výsledek obsadí samotné volání procedury. Chyby se musí ošetřovat pomocí handlerů. Tento kód jsem použil pro smazání všech triggerů. Příkaz SHOW TRIGGERS totiž také nelze použít ve vnořeném dotazu. Jak vidíte, nejde použít SELECT *, ale musí se jmenovitě uložit jednotlivé položky výsledku. delimiter | DROP PROCEDURE drop_triggers| CREATE PROCEDURE drop_triggers() BEGIN DECLARE done TINYINT(1) DEFAULT 0; DECLARE name VARCHAR(255) DEFAULT ''; DECLARE dummy VARCHAR(255) DEFAULT ''; DECLARE triggers CURSOR FOR SHOW triggers; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; PREPARE stmt FROM "DROP TRIGGER ?"; OPEN triggers; FETCH triggers INTO name, dummy, dummy, dummy, dummy, dummy, dummy, dummy; WHILE NOT done DO SET @name = name; EXECUTE stmt USING @name; FETCH triggers INTO name, dummy, dummy, dummy, dummy, dummy, dummy, dummy; END WHILE; CLOSE triggers; DEALLOCATE PREPARE stmt; END; | Edit: promýšlel jsem to, ale ve vašem případě bude opravdu lepší napřed přečíst komentáře a potom k nim dotáhnout info (které stačí pro každou spojovanou tabulku přetáhnout jen jednou). |
||
Časová prodleva: 16 let
|
0