Autor Zpráva
jakuje
Profil *
Začal jsem se trochu zajímat o složitější MySQL dotazy. Na www.linuxsoft.cz jsou celkem pěkně popsané, ale narazil jsem na prblém u spojení tabulek N:1 - Data z databáze vytáhnu jední příkazem, ale už mě nenapadá jak je vypsat, když je to jeden řádek z jedné tabulky a třeba 5 z druhé. Normálně vypisuji pomocí funkce mysql_fetch_array().
nightfish
Profil
jakuje
nejlepší to bude uvést na příkladu konkrétního dotazu... takže si zkus nějaký vymyslet
jakuje
Profil *
konkrétně ...
mám jednu tabulku kde mám id, nadpis, celkový popis a závěr. Potom mám druhou kde je id, id řádku z první tabulky, třeba nějakej obrázek a popis k němu.
Potom to vytáhnu SQL dotazem jako SELECT * FROM t1 LEFT JOIN t2 ON t1.id = t2.id
A ve výpisu by měl vypadnout celkový nadpis, celkový popis, pak celkový popis, potom všechny obrázky s popiskama z druhé tabulky a nakonec závěr.
k
Profil *
nedavej do selectu hvezdicku
select t1.id, t1.nadpis, t2.id from ....
a pak to pomoci mysql_fetch_assoc nebo mysql_fetch_array dostanes do pole.
k
Profil *
takze
select t1.id as id, t1.nadpis as nadpis, t2.id as id2 from ...

vystup:

array(
id=>value
nadpis=>value
id2=>value)
nightfish
Profil
takhle nějak...

$result = mysql_query("select t1.id as id, t1.nadpis as nadpis, t2.id as id2 from...");

$oldid = -1;
while ($data = mysql_fetch_row($result)) {
list($id,$nadpis,$id2) = $data;
if ($id == $oldid) {
//jestliže tento řádek má stejné $id jako předchozí
//vypiš obrázek s popiskem
} else {
//$id je rozdílné... vypiš nadpis, vypiš první obrázek s prvním popiskem
$oldid = $id;
}
}
jakuje
Profil *
Něco takového mě taky napadlo, ale říkal jsem si jestli to nejde nějak eledantněji. I tak děkuji. A myslíte že je to rychlejší než 2 selecty?
Jako jeden z t1 a druhý z t2 do cyklu.
k
Profil *
U MySQL jsou rychlejsi vnorene selecty nez joiny. Jestli jsi teda myslel tohle.
nightfish
Profil
k
U MySQL jsou rychlejsi vnorene selecty nez joiny. Jestli jsi teda myslel tohle.
imho ne...

jakuje chce, pokud jsem to správně pochopil, udělat jeden select na tabulku t1
a potom v cyklu pro každý řádek výsledku provádět select do tabulky t2, který bude v dalším cyklu vypisovat...

jednoznačně bych se klonil k řešení s joinem (ale jako cvičení si můžeš naprogramovat obojí a testovat, co je při jakých objemech dat rychlejší :-))
jakuje
Profil *
Ne. Jední selectem si vyberu nadpis atd a druhým udělám vpodstatě to co vy v tom přílkadě, ale bez té podmínky.


$result = mysql_query(select * from t1 where id = 1);
$mesic = mysql_fetch_array($result);

$result = mysql_query("SELECT * FROM t2 WHERE t1_id = 1")
while(mysql_fetch_array($result))
//vypis
nightfish
Profil
aaaaha, tak to jsem tě hned na začátku špatně pochopil
pakliže ti první dotaz vždy vrátí 1 řádek výsledku (tzn. víš které id chceš zobrazit), tak pak nemá smysl řešit joiny...
k
Profil *
jakuje
No trochu si asi nepochopil podstatu joinu. Join ti vlastne nahradi nejaky cyklus ktery bys musel pouzit.
Join bys pouzil v pripade ze neznas predem id(v tvem pripade cislo 1).


Pro priklad ktery uvadis nema moc smysl pouzivat joiny.
k
Profil *
eh tak nightfish me predbehl:)
jakuje
Profil *
no tak jo ... Tak díky vám oběma :)
Toto téma je uzamčeno. Odpověď nelze zaslat.