Autor Zpráva
Milanov
Profil *
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
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).

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: