Programujete-li objektově, musíte se trápit se složitými strukturami SELECT dotazů. V procedurálním programování to lze sice obejít pomocí kaskády jednoduchých dotazů, kdy výsledky zpracujete v php a opět pošlete dotaz na databázi, jenže je to na úkor výkonnosti a u navštěvovanějších větších webů s rozsáhlými databázemi by to bylo pro server neúnosné. Normální je, můžete-li všechna potřebná data získat z databáze v jednom dotazu, byť je většinou velmi komplikovaný. Kód se následně s velkými obtížemi edituje, avšak složené dotazy jsou při moderním programování nevyhnutelné.
Při sestavování dotazů můžete používat následující příkazy:
1 2 3 4 5 6 7 |
SELECT # Sloupce FROM seznam tabulek # Ze kterých tabulek vybírat řádky WHERE hlavní podmínka # Jaké podmínky musí řádky splňovat GROUP BY podle sloupců # Jak seskupit výsledky ORDER BY # Podle čeho třídit výsledky HAVING druhá podmínka # Jaké další podmínky musí řádky splňovat LIMIT # Omezení výběru co do množství řádek |
Nejjednodušší jsou vnořené dotazy. Mějme dvě tabulky: kontakty a kontakty_akce. Tabulka kontakty obsahuje běžné informace jako jméno, příjmení, adresa … (netřeba zde uvádět strukturu tabulky). Tabulka kontakty_akce slouží k zaznamenávání akcí nad kontakty. (Používá se například v CRM systémech, kdy potřebujete mít přehled, kdy a jaký typ zprávy jste komu poslali.)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
CREATE TABLE IF NOT EXISTS `kontakty_akce` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id_kontakty` int(11) NOT NULL, `typ` enum('email','dopis','vzorky','telefonat','osobne','1objednavka') NOT NULL, `datum` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `detaily` text NOT NULL COMMENT 'detaily dané akce', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ; -- -- Vypisuji data pro tabulku `kontakty_akce` -- INSERT INTO `kontakty_akce` (`id`, `id_kontakty`, `typ`, `datum`, `detaily`) VALUES (3, 1728, 'email', '2016-11-18 21:30:31', ''), (4, 1728, 'dopis', '2016-11-18 21:30:37', ''); |
1 2 3 4 5 6 7 |
SELECT *, ( SELECT GROUP_CONCAT(CONCAT_WS(', ', typ, datum) ORDER BY typ ASC SEPARATOR ';') FROM kontakty_akce ka WHERE ka.id_kontakty = c.id ) AS idlist FROM kontakty c |
V příkazu SELECT jsme zvolili hvězdičkou všechny záznamy a dále pomocí sjednocovacích příkazů CONCAT řetězec dat z tabulky kontakty_akce, která jsou oddělená středníkem.
Nejpoužívanější jsou každopádně JOINs. Hezky vysvětlené jsou na příkladě Marťanské základny.