Maximální délka GROUP_CONCAT
Školení, která pořádám
O užitečné funkci GROUP_CONCAT()
jsem už psal. Pokud se rozhodnete vytvářet touto funkcí delší řetězce, je dobré vědět o proměnné group_concat_max_len (výchozí hodnota 1024), která omezuje maximální délku výsledku této funkce. Pokud očekáváte delší výsledky, je nutné tuto proměnnou nastavit na vyšší hodnotu.
<?php
mysql_query("SET group_concat_max_len = 4096");
mysql_query("SELECT GROUP_CONCAT(id) FROM tab");
?>
Zdá se, že nastavení této proměnné na hodnotu -1
limit odstraní zcela, ale v dokumentaci jsem tuto informaci nenašel.
Přijďte si o tomto tématu popovídat na školení Návrh a používání MySQL databáze.
Diskuse
Souhlas, tohle je vcelku zajimava funkce. Sice micha aplikacni a prezentacni logiku do sebe, ale na druhou stranu mi umoznuje minimalizovat pocet dotazu do DB.
Ve chvilich, kdy je vykon serveru omezeny, tak na radu prichazeji takoveto funkce.
Pokud ovsem mam dostatek vykonu a optimalizovane dotazy, jiste je vyhodnejsi vyuzit skladani (tzn. vice dotazu). Mam pak zarucenou lepsi efektivitu pri praci s vracenymi daty. V opacnem pripade, pri sebemensi zmene musim zasahovat do dotazu nebo parsovat vracena data.
P.S. Trochu OT: Zajimalo by me, jaky nejefektivnejsi zpusob pouzivas pro zobrazeni pivotnich tabulek. Jediny mozny zpusob znam pomoci podselectu, group by s vyuzitim nejake agregacni funkce. Ve chvili, kdy ale neprevadim z radku do sloupcu ciselna data, ale napr. casy, je to trosku potiz.
O dynamicky skladanych dotazech toho moc na internetu neni. Obcas mi pripada, jako kdyz nikdo takoveto veci nedela :)
OT: Já takovéhle věci řeším na úrovni PHP - všechna data si načtu do dvourozměrného pole a to pole potom projdu. Dotaz je jednoduchý a rychlý, kód je krátký a přehledný, jen je to trošku náročnější na paměť - ale i to se dá vyřešit postupným vysypáváním dat. Viz také http://php.vrana.cz/spojovani-tabulek.php.
Jakub Vrána :
Odkazovaný článek neřeší přesně tento problém, proto je taky uvozen "Viz také". O vhodnosti řešení tohoto problému v PHP a ne v SQL jsem nicméně přesvědčen.
Ondrej Ivanic:
... a optimalizovane dotazy, jiste je vyhodnejsi vyuzit skladani (tzn. vice dotazu)...
Ake skladanie myslis, UNION? Pouzivanie UNIONu nad tou istou tabulkov nie je rozumny napad. Velmi zalezi na konktretnej implementacii planovaca dotazov, ale vo vseobecnosti sa ziaden vykon neziska (skor strati)
finc:
Nene, skladanin mam na mysli, ze pustis vice dotazu a vracena data nahrnes do DTO a posles na view vrstvu.
PeS:
Užitečná funkce, použil jsem ji např. ve výpisu katalogu kulturních akcí, které mohou být zařazeny do jedné a více tématických kategorií a je potřeba je taky zobrazit. Při výpisu pak načtu pouze seznam akcí, kde ID jednotlivých témat jsou zgrupovaný pomocí GROUP_CONCAT, a seznam témat. Názvy témat načtu do asociativního pole a podle klíče dotahuju k jednotlivejm položkám. Dalo by se to udělat i jedním dotazem, ale to už by bylo míchání aplikační a prezentační logiky, jak zaznělo v prvním příspěvku.
Diskuse je zrušena z důvodu spamu.