SQL: Svislé spojení tabulek
se zachováním informace o zdroji každého řádku
28.6.2012
Pokud potřebujete v SQL vertikálně spojit tabulky se stejnou strukturou,
seřadit v nich společně data podle zvoleného kritéria,
a zachovat si informaci, ze které tabulky který řádek pochází
(vytvořit sloupec s označením zdroje),
můžete pomocí sjednocení UNION spojit dotazy SELECT,
a abyste věděli, ze které tabulky řádek je, můžete do každého dotazu přidat konstantu.
Dá se totiž předpokládat, že v každé tabulce bude id (či jiný primární klíč) začínat od jedničky,
a že podle id tedy příslušnost řádku k tabulce nepoznáte.
$dotaz = "SELECT *, 'prvni' as zdroj FROM prvnitabulka WHERE verejny='1' AND datum <= NOW() AND rubrika>=18 AND rubrika<=25
UNION
SELECT *, 'druhy' as zdroj FROM druhatabulka WHERE verejny='1' AND datum <= NOW() AND (rubrika=1 OR rubrika=5 OR rubrika=7)
ORDER BY datum DESC
LIMIT 50;"
$vysledek = mysql_query($dotaz);
while ($radek = mysql_fetch_array($vysledek))
{ // Tady máme kromě ostatních sloupců k dispozici i proměnnou $radek["zdroj"], ve které nalezneme hodnotu 'prvni', nebo 'druhy';
}
Podmínky pro výběr dat (datum – např. aby se nezobrazovaly články, které teprve mají být vydány; rubrika) můžete zadat za WHERE v každém dotazu samostatně, tedy i v jednotlivých dotazech různě.
Pokud chcete vypsat např. 50 nejnovějších článků myšleno dohromady z obou zdrojů,
tak „ORDER BY” a LIMIT napište za celé spojení, aby se vybralo opravdu 50 nejnovějších článků z obou zdrojů souhrnně.
V praxi takové spojení využijete např. když budete potřebovat vytvořit sestavu nejnovějších článků ze dvou původně izolovaných časopisů,
pokud mají tabulky stejnou strukturu a jsou ve stejné databázi.
Díky zachování informace o původu článku pak budete vědět, kam máte odkázat na plné znění článku.
Data ze všech tabulek tak jsou sloučena v jednom výsledku
a podle sloupce zdroj poznáte, ze které původní tabulky který řádek pochází.
Pokud těch tabulek potřebujete spojit více, tak nic nebrání tomu, abyste textový řetězec s dotazem vytvořili pomocí for cyklu (nebo foreach nad polem) a konstantu do každého dotazu vkládali automatizovaně (přímo pořadové číslo z proměnné $i, kterou budete počítat průchody cyklu; nebo pomocí pole textových řetězců můžete vkládat názvy).
Více se o sjednocení tabulek pomocí UNION dozvíte na w3c schools.com – SQL UNION Operator
.
Martin Adámek
unikátní obsah této stránky
Navigační menu
Tyto stránky jsou pravidelně archivovány Národní knihovnou ČR pro svou kulturní, vzdělávací, vědeckou, výzkumnou nebo jinou informační hodnotu za účelem dokumentace autentického vzorku českého webu. Jsou součástí kolekce českých webových stránek, které NK ČR hodlá dlouhodobě uchovávat a zpřístupňovat pro budoucí generace. Jejich záznam je součástí České národní bibliografie a katalogu NK ČR.
Skrýt nástroje