Autor | Zpráva | ||
---|---|---|---|
wNi' Profil * |
Dobrý deň,
V indexe mojej stránky vypisujem články, a k nim si chcem vypísať, koľko je k nim komentárov. Čiže mám v databázi tabulky "articles" a "comments". Tento script som odniekial sosol, upravil so msi ho podľa svojho gusta tak, aby fungoval, vypisuje obsah "articles": $spojenie = mysql_connect("localhost", "datab", "passwd"); // vytvára spojenie s databázovým serverom mysql_select_db("datab", $spojenie); // výber aktívnej databázy $vysledok = mysql_query( // vykonávanie SQL príkazu "SELECT * FROM articles ORDER BY date desc limit 10", $spojenie); /* Cyklom prechádzam riadky výsledku a vytahujem z neho hodnoty do nového pola $zaznam*/ while ($zaznam = mysql_fetch_array($vysledok) ): // nacíta záznam výsledku do asociatívneho pola echo "<tr><td valign='top'><a href='article.php?id=$zaznam[id]'>"; $filename = './upload/'.$zaznam['id'].'.png'; if (file_exists($filename)) { echo "<img src='upload/"; echo $zaznam["id"]; echo ".png' align='left' style='margin: 20px 16px 0 16px;' height='200' width='200'>"; } else { echo "<img src='obr/coming_soon.jpg' align='left' style='margin: 20px 16px 0 16px;'>"; } echo "</a></td><td width='650px' valign='top'>"; echo "<p><a class='link' href='article.php?id="; echo $zaznam["id"]; echo "'>"; echo $zaznam["title"]; echo "</a><p class='posted'>"; echo "Posted by "; echo $zaznam["autor"]; echo " on "; echo datum($zaznam["date"], true, true); echo "</p><br /><p class='intro'>"; echo nl2br($zaznam["intro"]); echo "</p>"; if ($zaznam['autor'] == $_SESSION['login']) { echo "<a href='update.php?id="; echo $zaznam["id"]; echo "'><img src='icon/update.png'></a>"; echo "<a href='delete.php?id="; echo $zaznam["id"]; echo "'><img src='icon/delete.png'></a>"; } echo "<p class='continue'>(<a class='cont' href='article.php?id="; echo $zaznam["id"]; echo "'>Continue</a>)"; echo "</p></td></tr>"; echo "<p>"; echo "</p>"; endwhile; Aj funguje, avšak teraz, keď dotváram stránku ešte viac, narazil som na problém. Možno sa jedná o banalitu, pre vás skúsenejších, ale ja sám neviem, ako mám spojiť 2 selecty dohromady, pretože niekde dostredu potrebujem narvať tento kód (aby som si vypísal počet komentárov): $sql = mysql_query("SELECT * FROM comments WHERE article_id=".$zaznam["id"]) or die(mysql_error()); $num_rows = mysql_num_rows($sql); if ($num_rows == 1) { echo "<font style='color: #5f5f5f; font-size: 30px; margin-left: 10px;'>$num_rows Comment</font></p>"; } else { echo "<font style='color: #5f5f5f; font-size: 30px; margin-left: 10px;'>$num_rows Comments</font></p>"; } No a tu narážam na celkový problém, keďže v dopyte sa pýtam na $zaznam["id"], keď ho ale napchám do while-u, tak mi samozrejme vypíše error typu "Pozri manuál pre select"... Neviem čo s tým, spravil by som to aj tak, že by som ten prvý select na 2x rozsakroval a dostredu napchal tento jeden, ale to mi aj tak potom nezoberie tu premennú. :( Pozrel som sa na W3.org, ale nenašiel som žiadnu ani len ukážku multiple-selectingu, existuje také niečo vôbec? Vopred Ďakujem |
||
Kajman_ Profil * |
#2 · Zasláno: 17. 2. 2011, 10:48:30
V tohle případě bych místo spojení použil korelovaný poddotaz.
$vysledok = mysql_query( // vykonávanie SQL príkazu "SELECT a.*, (select count(*) from comments c where c.article_id=a.id) num_comments FROM articles a ORDER BY a.date desc limit 10", $spojenie); ... echo "<font style='color: #5f5f5f; font-size: 30px; margin-left: 10px;'>{$zaznam['num_comments']} Comment".($zaznam['num_comments']==1?"":"s")."</font></p>"; |
||
Kcko Profil |
#3 · Zasláno: 17. 2. 2011, 10:58:36
Kajman:
Proč korelovaný? |
||
jenikkozak Profil |
#4 · Zasláno: 17. 2. 2011, 10:59:17
wNi':
„Pozrel som sa na W3.org, ale nenašiel som žiadnu ani len ukážku multiple-selectingu, existuje také niečo vôbec?“ Na W3.org Vám měli říct, že tag <font> se pomalu hodí nepoužívat. Na MySQL existují lepší zdroje informací. |
||
Kajman_ Profil * |
#5 · Zasláno: 17. 2. 2011, 10:59:42
Protože tam je limit 10.
|
||
Kcko Profil |
#6 · Zasláno: 17. 2. 2011, 11:04:02
Aby se nespojovaly vsechny komentare s clanky a pote se to teprve omezilo limitem?
Nebyla by by vhodnejsi nejdrive docasna ("derivovana"), pouze na clanky s limitem a pak se na na ni ty komentare napoji? |
||
wNi' Profil * |
#7 · Zasláno: 17. 2. 2011, 11:06:04
Výborne funguje to! :).. Ďakujem veľmi si mi pomohol Kajman_, Pozrem sa teda aj po tých lepších zdrojoch ;-) Ja som ešte vždy začiatočník, preto neviem kam mám chodiť pre informácie, aj toto čo som sem hodil som prakticky len stiahol a upravil...
Ďakujem za pomoc |
||
Kajman_ Profil * |
#8 · Zasláno: 17. 2. 2011, 11:13:26
Aby se nespojovaly vsechny komentare s clanky a pote se to teprve omezilo limitem?
Ano. Nebyla by by vhodnejsi nejdrive docasna ("derivovana"), pouze na clanky s limitem a pak se na na ni ty komentare napoji? Tipnul bych, že to vyjde skoro na stejno, můžeš to zkusit změřit :-) Při větším limitu tam možná už drobný rozdíl naměřit půjde. Kdyby z nějakého důvodu chyběl index na article_id, tak už by ten rozdíl byl asi patrnější. Hlavně ten korelovaný je pro začátečníka čitelnější než group by na spojení limitním poddotazem :-) |
||
Kcko Profil |
#9 · Zasláno: 17. 2. 2011, 13:22:45
Kajman:
Tipnul bych, že to vyjde skoro na stejno, můžeš to zkusit změřit :-) Tolik času nemám :] Hlavně ten korelovaný je pro začátečníka čitelnější než group by na spojení limitním poddotazem :-) Jasně, myslel jsem si to, díky za objasnění. |
||
Kajman_ Profil * |
#10 · Zasláno: 17. 2. 2011, 17:13:42
Kcko:
Tak při běžném pokusu to vypadá, že varianta s korelovaný poddotazem a varianta z faq s limitem mají skoro stejné časy (kor. o trošičku rychlejší) i stejný explain. Naopak "optimalizační" verze s připojeným poddotazem s limitem a to joinované na komentáře je pomalejší (podle počtu řádků daných limitem - 1 - stejné, 10 - 100% zpomalení, 100 - 138% 1000 - 166%) Na jiné tabulce jinou verzí plánovače to samozřejmě může dopadnout třeba i jinak. |
||
Časová prodleva: 13 let
|
0