Beste,

Ik heb voor mijn forum index pagina de volgende query (zie onder uitleg). Deze query zou er voor moeten zorgen dat ik op mijn index pagina de volgende structuur zou moeten krijgen:


categorie
	subcategorie 1    |   3   |   1   |   Milo, 01 november 2010, 17:48
    subcategorie 2    |   2   |   2   |   Milo, 01 november 2010, 17:48


hij geeft echter dit:


categorie
	subcategorie 1    |   4   |   2   |
    subcategorie 2    |   3   |   2   |   Milo, 01 november 2010, 17:48


de query:

<?php
$qry = "SELECT
			cat.title                                  AS cat,
			
			subCat.id                                  AS subCatID,
			subCat.title                               AS subCat,
			
			COUNT(t.id)                                AS topics,
			
			u.username,
			
			DATE_FORMAT(p.dateTime, '%d %M %Y, %H:%i') AS newPostDateTime,
			COUNT(p.id)                                AS posts
		FROM
			forum AS cat
		LEFT JOIN
			forum AS subCat
		ON
			cat.id = subCat.parent_id
		LEFT JOIN
			forum_topic     AS t
		ON
			subCat.id = t.cat_id
		LEFT JOIN
			forum_post      AS p
		ON
			t.id = p.top_id
		LEFT JOIN
			user            AS u
		ON
			p.user_id = u.id
		WHERE
			cat.parent_id = 0
		GROUP BY
			subCat.id
		ORDER BY
			cat.id,
			subCat.title";
?>


Ik geraak er niet meer uit, ik heb 4 left join om alles te kunnen selecteren, en groepeer op de subcategorie zodat alles netjes weergegeven word. Ziet iemand waar ik de plank totaal missla in deze query?

Gr, milo
Is alles wel een left join?
Je group by klopt niet. Je selecteert meer dan waarop je groepeert.
(heeft het niet uitgeprobeerd) Wanneer je LEFT JOINt, kunnen waarden uit de aangejoinde tabel NULL zijn. Dat levert een niet-match op voor in de SELECT. Krijg je goede resultaten wanneer je NULLs opvangt met COALESCE() ?
Bas Cost Budde op 26/11/2010 14:48:21

(heeft het niet uitgeprobeerd) Wanneer je LEFT JOINt, kunnen waarden uit de aangejoinde tabel NULL zijn. Dat levert een niet-match op voor in de SELECT. Krijg je goede resultaten wanneer je NULLs opvangt met COALESCE() ?


Je moet naar de verschillende soorten joins kijken. Wat hun eigenschappen e.d. zijn.
Ik denk dat een left join hier verkeerd is, aangezien je vast en zeker relaties hebt die niet null moeten hebben.
COALESCE ken ik niet. Maar lijkt mij ook niet correct.
Ik ben nog even wat tutorials aan het lezen over joins, had niet verwacht dat het hierin kon zitten *schaamt zich...*.
En je group by klopt ook niet.
Zeker bij ingewikkeldere dingen is het handiger om bijvoorbeeld een [google]erd[/google] op te stellen.
Okee, ik ga even met deze tips aan de slag. Lukt het niet horen jullie het wel weer ;).

Edit 1
Ik heb in ieder geval zo'n ERD gemaakt. Bij me forum_post tabel stond eerst ook een cat_id, maar dit is volgens mij overbodig zodra ik een inner join gebruik niet waar?

Klik hier voor de ERD

Edit 2
Na ook wat info over de GROUP BY door te hebben genomen ben ik erachter wat je bedoelde. Alle geselecteerde items behalve de COUNT() gedeeltes moeten in de GROUP BY komen. Tot nu toe kan ik niet zeggen dat me resultaat beter wordt, maar dit kan aan de JOIN fouten liggen neem ik aan...

Edit 3
Momenteel heb ik dit (denk de lijntjes weg, is om even overzichtelijk te zijn.)


<?php
$sql =
"
SELECT
	cat.title                                  AS cat,
            
	subCat.id                                  AS subCatID,
	subCat.title                               AS subCat
FROM
	forum AS cat

-------------------------------------
LEFT JOIN
	forum              AS subCat
ON
	cat.id = subCat.parent_id	
-------------------------------------
INNER JOIN
	(
	forum_topic        AS t
		
		INNER JOIN
			forum_post AS p
		ON
			t.id = p.top_id
	)
	ON
		subCat.id = t.cat_id
-------------------------------------
WHERE
	cat.parent_id = 0
GROUP BY
	cat.title,
	subCat.id,
	subCat.title
ORDER BY
	cat.id,
	subCat.title
";
?>


Ik moet nu eten, maar tips zijn welkom...
Ondertussen nog steeds veel aan het lezen, maar blijf het een lastig onderwerp vinden. Zit ik wel een beetje in de goede richting of zit ik me blind te staren op iets totaal verkeerds?
Bump, sorry maar 't gaat niet voorspoedig, zit nog steeds vast.
Ik heb het zelfde probleem, heb jij het misschien op kunnen lossen?

Reageren