Archief - PHP/MySQL: Optimalizeren queries

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

S3cT0r

Legacy Member
'lo, ik ben bezig met het redesign van mijn website, zowel vanbinnen en vanbuiten. En op een bepaald moment kom ik over de PHP/MySQL die ervoor zorgt dat het nieuws + commentcount op de main page komt. Eigenlijk zie ik in dat die dus inefficiënt werkt:

Code:
include 'mysql.inc.php';
$r=mysql_query("SELECT `id`,`title`,`author`,`email`,`text`,`pic` FROM `spnews` ORDER BY `id` DESC");
while ($tmp=mysql_fetch_array($r)) {
	$q=mysql_query("SELECT COUNT(`newsid`) FROM `comments` WHERE `newsid` = '".$tmp[0]."'");
	$test=mysql_fetch_array($q);
	echo "<h2>$tmp[1]</h2>";
	echo '<p>';
	if ($tmp[5]!='none') echo '<img class="left" src="'.$tmp[5].'" onclick="win(this)" width="130px" height="90px">';
	echo $tmp[4];
	echo '<code>Authored by <a href="mailto:'.$tmp[3].'">'.$tmp[2].'</a> :: <a href="#">Comments('.$test[0].')</a>';
	echo '</p>';
}
mysql_close($li);

Zoals je ziet moet ik een 2de query verrichten in de loop gewoon om het comment-aantal te krijgen, ik heb een vaag vermoeden dat ik dit in de eerste query kan incorporeren. Zodoende heb ik dus wat gelezen over JOIN's, maar wat ik ook probeer, het loopt gegarandeerd mis. Kan iemand mij een ruggesteuntje geven?

dJeez

Legacy Member
Op 't eerste zicht zou 'k 't volgende denken (maar 'k denk niet echt zuiver - need food :p) :
SELECT `id`,`title`,`author`,`email`,`text`,`pic`, COUNT(newsid)
FROM `spnews`
INNER JOIN comments ON newsid = id
GROUP BY id
ORDER BY `id` DESC

DarkBone

Legacy Member
Kijk eens of deze query het doet?

Code:
SELECT `id`,`title`,`author`,`email`,`text`,`pic`, COUNT(`newsid`) AS aantal FROM `spnews` LEFT JOIN `comments` ON `id` = `newsid` GROUP BY `id` ORDER BY `id` DESC

*edit*
Hehe, djeez was net eerder, maar de query is nagenoeg gelijk zie ik. Alleen denk ik dat het een LEFT JOIN moet zijn. Anders worden nieuwsberichten zonder comments niet afgebeeld!

dJeez

Legacy Member
Zoals ik dus zei : ik denk niet echt zuiver momenteel. De inner join moet idd een left join zijn, anders zouden de topics zonder comments niet meegenomen worden, maw Darkbone z'n query zou moeten werken :p.

En nu ga 'k eten.

S3cT0r

Legacy Member
Manne, twerkt (met toevoegin van een paar tablenames voor ambiguity errors, maar dat konden jullie niet weten), kben superblij :D

Duizendmaal bedankt.

(was eerst een beetje hulp gaan vragen in #mysql op QuakeNet, man wat voor een ongelikte beer is die snot seg)

Nog es bedankt :)

DarkBone

Legacy Member
50Euro zei:
Wat is die Inner Join en Left join? :crazy:

lees de manual erop na, heeft te maken met resultaten uit meerdere tabellen op te halenen samen te voegen
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan