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&nbsp;";
echo $zaznam["autor"];
echo "&nbsp;on&nbsp;";
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 *
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
Kajman:
Proč korelovaný?
jenikkozak
Profil
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 *
Protože tam je limit 10.
Kcko
Profil
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 *
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 *
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
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 *
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: