Forum ophalen met 1 mysql query en in 1 array stoppen
Ik wil graag met 1 mysql query een forum overzicht ophalen en in een array stoppen.
Je hebt dus:
- forum_categories (forum categorieen)
Deze tabel bevat alle gegevens over een categorie
- forum_categories_moderators (forum moderators)
Deze tabel bevat de velden catID en userID
- users_profiles (gebruikers)
Tot slot bevat deze tabel de gegevens van gebruikers. Doormiddel van ID's kan ik zo de gebruikersnaam ophalen uit die tabel.
Mijn probleem is echter dat ik met smarty werk en alles dus in een array moet gooien. Ik heb al 4 dagen lopen rotzooien met LEFT JOINS en INNER JOINS en kom er niet meer uit. Ik wil graag dat hij een lijst van moderators bij de juiste forum categorie zet. Dat word dus een lus in een lus. Ik wil dit allemaal in 1 array stoppen met 1 mysql query.
Weet iemand wat de beste (of in elk geval alsjeblieft een werkende) methode is om alle data op deze manier in een array te stoppen en te parsen naar smarty?
Met een LEFT JOIN voegt hij bij elke 'moderator' een hele nieuwe rij toe waardoor ik ineens dubbele categorieen te zien krijg. Dat terwijl ik die gegevens juist in een array wil hebben.
Ik zie door de bomen het bos niet meer, bedankt!
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
public function get_categories() {
$query = '
SELECT
*,
cats.ID AS ID,
mods.userID AS mID,
moderator.username AS musername,
author.username AS lpauthor,
DATE_FORMAT(cats.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime
FROM
forum_categories AS cats
LEFT JOIN
forum_categories_moderators AS mods ON cats.ID = mods.catID
LEFT JOIN
users_profiles AS author ON cats.lpauthorID = author.ID
LEFT JOIN
users_profiles AS moderator ON mods.userID = moderator.ID
ORDER BY
cats.listorder';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
$cats[] = $row;
}
return $cats;
}
?>
public function get_categories() {
$query = '
SELECT
*,
cats.ID AS ID,
mods.userID AS mID,
moderator.username AS musername,
author.username AS lpauthor,
DATE_FORMAT(cats.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime
FROM
forum_categories AS cats
LEFT JOIN
forum_categories_moderators AS mods ON cats.ID = mods.catID
LEFT JOIN
users_profiles AS author ON cats.lpauthorID = author.ID
LEFT JOIN
users_profiles AS moderator ON mods.userID = moderator.ID
ORDER BY
cats.listorder';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
$cats[] = $row;
}
return $cats;
}
?>
Geeft dit:
http://i5.photobucket.com/albums/y199/Ne0que/forumss.jpg
Gewijzigd op 01/01/1970 01:00:00 door Dominique
Niet getest, maar zoiets:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?php
public function get_categories() {
$query = '
SELECT
*,
cats.ID AS ID,
mods.userID AS mID,
moderator.username AS musername,
author.username AS lpauthor,
DATE_FORMAT(cats.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime,
(SELECT * FROM user_profiles WHERE rank < 2) AS moderators
FROM
forum_categories AS cats
LEFT JOIN
forum_categories_moderators AS mods ON cats.ID = mods.catID
LEFT JOIN
users_profiles AS author ON cats.lpauthorID = author.ID
LEFT JOIN
users_profiles AS moderator ON mods.userID = moderator.ID
ORDER BY
cats.listorder';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
$cats[] = $row;
}
return $cats;
}
?>
public function get_categories() {
$query = '
SELECT
*,
cats.ID AS ID,
mods.userID AS mID,
moderator.username AS musername,
author.username AS lpauthor,
DATE_FORMAT(cats.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime,
(SELECT * FROM user_profiles WHERE rank < 2) AS moderators
FROM
forum_categories AS cats
LEFT JOIN
forum_categories_moderators AS mods ON cats.ID = mods.catID
LEFT JOIN
users_profiles AS author ON cats.lpauthorID = author.ID
LEFT JOIN
users_profiles AS moderator ON mods.userID = moderator.ID
ORDER BY
cats.listorder';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
$cats[] = $row;
}
return $cats;
}
?>
Heb er dus een subquery in gemaakt (bij je SELECT).
Daar selecteer je dus de moderators (en zal, denk ik, een subarray geven in je array).
Hoe je de moderators bij de goede categorie geeft: geen idee.
Kwestie van proberen.
Hmm ik wist niet dat dat kon, maar bedankt.
"Subquery returns more than 1 row"
Natuurlijk kan een forum meerdere moderators hebben. Ik heb mijn database structuur ietsjes aangepast. Er zijn 2 moderators voor elk forum. Zit er dan echt niks anders om dan voor elk forum in een loop queries voor moderators gaan zitten uitvoeren? Ik moet toch meerdere rijen kunnen invoegen bij een subquery? Dit is mijn code nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?
public function get_categories() {
$query = '
SELECT
forums.ID AS ID,
forums.title,
forums.description,
forums.posts,
forums.topics,
forums.lptopicID,
forums.lpID,
DATE_FORMAT(forums.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime,
forums.lpauthorID,
user.username AS lpauthorname,
cats.title AS category,
(SELECT userID FROM board_moderators AS mods WHERE mods.forumID = forums.ID) AS moderators
FROM
board_forums AS forums
INNER JOIN
board_categories AS cats ON cats.id = forums.catID
INNER JOIN
users_profiles AS user ON user.ID = forums.lpauthorID
';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
// Making URLS
$row['forumURL'] = 'index.php?module=forum&page=forum&id='.$row['ID'];
$row['lptopicURL'] = 'index.php?module=forum&page=topic&id='.$row['lptopicID'];
$row['lpURL'] = $row['lptopicURL'].'#'.$row['lpID'];
$row['lpauthorURL'] = 'index.php?module=user&page=profile&id='.$row['lpauthorID'];
$cats[] = $row;
}
return $cats;
}
?>
public function get_categories() {
$query = '
SELECT
forums.ID AS ID,
forums.title,
forums.description,
forums.posts,
forums.topics,
forums.lptopicID,
forums.lpID,
DATE_FORMAT(forums.lpdatetime, "%d %b %Y om %H:%i") AS lpdatetime,
forums.lpauthorID,
user.username AS lpauthorname,
cats.title AS category,
(SELECT userID FROM board_moderators AS mods WHERE mods.forumID = forums.ID) AS moderators
FROM
board_forums AS forums
INNER JOIN
board_categories AS cats ON cats.id = forums.catID
INNER JOIN
users_profiles AS user ON user.ID = forums.lpauthorID
';
$result = mysql_query($query) or die(mysql_error());
while ($row = mysql_fetch_assoc($result)) {
// Making URLS
$row['forumURL'] = 'index.php?module=forum&page=forum&id='.$row['ID'];
$row['lptopicURL'] = 'index.php?module=forum&page=topic&id='.$row['lptopicID'];
$row['lpURL'] = $row['lptopicURL'].'#'.$row['lpID'];
$row['lpauthorURL'] = 'index.php?module=user&page=profile&id='.$row['lpauthorID'];
$cats[] = $row;
}
return $cats;
}
?>
Niet Bumpen::
Gewijzigd op 01/01/1970 01:00:00 door Dominique