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.

Jakub Vrána, Řešení problému, 25.4.2007, diskuse: 7 (nové: 0)

Diskuse

ikona finc:

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 :)

ikona Jakub Vrána OpenID:

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.

ikona finc:

Mel jsem na mysli neco jineho, viz: http://www.linuxsoft.cz/article.php?id_article=933

ikona Jakub Vrána OpenID:

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)

ikona 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.

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.