| 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: 15 let
|
|||
0