hulp met gegevens halen uit een andere tabel.
Ik ben bezig met een toplijst te maken bestaande uit 2 tabellen
1. Users
Username
id
2. Supermarkten
id
user_id
name
Nu probeer ik de gegevens op te halen van deze leden met het volgende:
Code (php)
1
2
3
2
3
$sql_query = "SELECT users.username, users.avatar,users.id, count(user_id) AS points FROM users LEFT JOIN supermarkten ON user_id = users.id GROUP BY user_id ORDER BY id ASC LIMIT 100";
$sql = MySQL::Query($sql_query);
while($row = mysql_fetch_object($sql)){
$sql = MySQL::Query($sql_query);
while($row = mysql_fetch_object($sql)){
Hij geeft de leden wel weer met een aantal supermarkten, alleen ik heb op dit moment 5 leden, hij weergeeft er maar 4.
terwijl ik in de Query aangeef dat hij 100 leden mag laten zien.
Alvast bedankt
Maar dit zou ook meteen je probleem kunnen zijn. Ik ben er niet helemaal zeker van, maar de LIMIT zou wel eens kunnen gelden voor de GROUP BY. Met andere woorden, 100 rijen worden opgehaald en die worden vervolgens gegroepeerd. Daar blijken dan maar 4 uit over te blijven (en waarschijnlijk kloppen de 'points' dan ook niet allemaal).
Probeer het eens zonder limit, krijg je dan wel alle 5 te zien?
Inderdaad zonder limit laat hij wel alles zien, maar ik wil dus de 100 leden met de meeste supermarkten weergeven, en niet alle leden.
Dan moet je de sum doen in een subquery en die joinen. Daarmee krijg je voor alle leden maar 1 record en zal het wel werken.
en hoe doe ik dat?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT users.username, users.avatar, users.id, t.points
FROM users
LEFT JOIN (
SELECT user_id, COUNT(user_id) AS points
FROM supermarkten
GROUP BY user_id
) AS t ON t.user_id = users.id
ORDER BY t.points DESC
LIMIT 100
FROM users
LEFT JOIN (
SELECT user_id, COUNT(user_id) AS points
FROM supermarkten
GROUP BY user_id
) AS t ON t.user_id = users.id
ORDER BY t.points DESC
LIMIT 100
Je ziet nu dat ik de tabel supermarkten in je originele query heb vervangen door een select statement (de subquery) en op die manier de punten toevoeg aan de query. Nu krijg je in je uiteindelijke resultaat maar 1 rij per gebruiker en dus kan je zonder problemen op 100 gebruikers limiteren.
Het enige wat ik verder heb aangepast is het ORDER BY statement. Je zegt namelijk dat je de gebruikers met de meeste punten wilde hebben, maar je sorteerde op id.
Gewijzigd op 13/08/2012 08:21:25 door Erwin H
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT users.username, users.avatar, users.id,
COALESCE(t.points, 0)
FROM users
LEFT JOIN (
SELECT user_id, COUNT(user_id) AS points
FROM supermarkten
GROUP BY user_id
) AS t ON t.user_id = users.id
ORDER BY t.points DESC
LIMIT 100
COALESCE(t.points, 0)
FROM users
LEFT JOIN (
SELECT user_id, COUNT(user_id) AS points
FROM supermarkten
GROUP BY user_id
) AS t ON t.user_id = users.id
ORDER BY t.points DESC
LIMIT 100
Toevoeging op 13/08/2012 09:30:21:
Overigens moet dit ook gewoon werken:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT u.username, u.avatar, u.id, COUNT(s.user_id) AS points
FROM users AS u
LEFT JOIN supermarkten AS s ON s.user_id = u.id
GROUP BY u.id
OREDR BY points DESC
LIMIT 100
FROM users AS u
LEFT JOIN supermarkten AS s ON s.user_id = u.id
GROUP BY u.id
OREDR BY points DESC
LIMIT 100
Het probleem zat um in de GROUP BY op een kolom uit de LEFT JOINed tabel
Gewijzigd op 13/08/2012 09:31:17 door Ger van Steenderen