Beste php’er,

Ik wil een soort van boom-structuur maken met php en mysql, deze moet er zo uitzien:

Categorie 1
- sub-categorie 1
- sub-categorie 2
- sub-categorie 3

Categorie 2
- sub-categorie 1
- sub-categorie 2

Hier heb ik de volgende tabel voor bedacht:

Categorie:
	- id
	- parent_id
	- titel


Maar wat voor query kan ik hier op loslaten om het in 1 keer te doen, en niet in verschillende delen. Dus 1 query en mogelijk meerdere loops.

Alvast bedankt!
Hoi Milo,

Het ging toch om een stukje weergave?

<?php
//bij eerste cat, wel variabele gedefinieerd voor "previous cat"
$prev_cat = '';
while($row = mysql_fetch_assoc($result))
{
if($prev_cat != $row['cat'])
{
echo $row['cat'];
}
echo $row['subcat'];
$prev_cat = $row['cat'];
}
?>

Deze loop zal op jou scherm en de query die hiervoor is gebruikt, keurig de structuur opbouwen zoals je hem hebben wou.
Ik heb nu het volgende probleem. Hij selecteert alles en geeft alles weer, maar omdat ik nu verder ga aantal posts enzo ophalen. Ontstaat er een probleem.

Mijn query:

<?php
$qry = "SELECT
			cat.title                                  AS cat,
			
			subCat.id                                  AS subCatID,
			subCat.title                               AS subCat,
			
			COUNT(t.id)                                AS topics,
			
			p.user_id                                  AS postUser,
			DATE_FORMAT(p.dateTime, '%d %b %Y, %H:%i') AS newPostDateTime,
			COUNT(p.id)                                AS posts
		FROM
			categorie AS cat
		LEFT JOIN
			categorie AS subCat
		ON
			cat.id = subCat.parent_id
		LEFT JOIN
			topic     AS t
		ON
			subCat.id = t.cat_id
		LEFT JOIN
			post      AS p
		ON
			subCat.id = p.cat_id
		WHERE
			cat.parent_id = 0
		GROUP BY
			subCat.id
		ORDER BY
			cat.id,
			subCat.title";
?>


Nu geeft hij bij posts 2 aan terwijl er maar 1 record in me post tabel staat... heel apart. Het lijkt dus wel of hij alles keer 2 doet, ik kan natuurlijk wel gewoon delen door 2, maar dit is natuurlijk niet de bedoeling. Weet iemand wat er fout gaat? Heb de query nu 2 maal opnieuw opgebouwd in de hoop dat het een simpel foutje was maar dit is helaas niet zo...
Kan je van alle gevonden rows een print_r geven?
Ben er inmiddels achter dat de fout bij GROUP BY zit, probeer de oplossing te vinden...

Here it is:


Array
(
	[0] => Categorie 1
    [cat] => Categorie 1 
    [1] => 3
    [subCatID] => 3
    [2] => Subcategorie 1
    [subCat] => Subcategorie 1
    [3] => 6
    [topics] => 6
    [4] => 1
    [postUser] => 1 
    [5] => 24 Oct 2010, 11:49 
    [newPostDateTime] => 24 Oct 2010, 11:49 
    [6] => 6 [posts] => 6
)

1Array
(
    [0] => Categorie 1 
    [cat] => Categorie 1 
    [1] => 4 
    [subCatID] => 4 
    [2] => Subcategorie 2
    [subCat] => Subcategorie 2
    [3] => 0
    [topics] => 0
    [4] => [postUser] => [5] => [newPostDateTime] => [6] => 0 [posts] => 0
)

1Array
(
    [0] => Categorie 1
    [cat] => Categorie 1
    [1] => 5
    [subCatID] => 5
    [2] => Subcategorie 3
    [subCat] => Subcategorie 3
    [3] => 0 [topics] => 0
    [4] => [postUser] => [5] => [newPostDateTime] => [6] => 0 [posts] => 0
)

1Array
(
    [0] => Categorie 2
    [cat] => Categorie 2 
    [1] => 6 
    [subCatID] => 6 
    [2] => Subcategorie 1
    [subCat] => Subcategorie 1
    [3] => 0
    [topics] => 0
    [4] => [postUser] => [5] => [newPostDateTime] => [6] => 0 [posts] => 0
)

1Array 
(
    [0] => Categorie 2 
    [cat] => Categorie 2 
    [1] => 7 [subCatID] => 7 
    [2] => Subcategorie 2 
    [subCat] => Subcategorie 2 
    [3] => 0 [topics] => 0 
    [4] => [postUser] => [5] => [newPostDateTime] => [6] => 0 [posts] => 0
) 1
Ik denk dat je van de postcount beter een subquery kan maken ipv een join, dat scheelt hoogstwaarschijnlijk ook een hoop in je performance. Werkt dit?

<?php
$qry = "SELECT
cat.title AS cat,

subCat.id AS subCatID,
subCat.title AS subCat,

COUNT(t.id) AS topics,


lastPost.user_id AS postUser,
lastPost.date AS newPostDateTime,
lastPost.count AS postCount


FROM
categorie AS cat,
(
SELECT
count(id) as count,
user_id,
DATE_FORMAT(dateTime, '%d %b %Y, %H:%i') as date
FROM
post
WHERE
cat_id = subCat.id
ORDER BY
dateTime DESC
LIMIT
1
) as lastPost

LEFT JOIN
categorie AS subCat
ON
cat.id = subCat.parent_id
LEFT JOIN
topic AS t
ON
subCat.id = t.cat_id
WHERE
cat.parent_id = 0
GROUP BY
subCat.id
ORDER BY
cat.id,
subCat.title";
?>
Zoiets?

Waarom heeft post eigenlijk een cat_id kolom?
Helaas loopt dan alles in de soep, geeft ie een dikke error dat subCat niet bestaat terwijl die dat wel doet.
Post heeft een cat_id om zo makkelijk de aantal post per categorie te kunnen tellen.

Reageren