hulp met gegevens halen uit een andere tabel.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rick kem

rick kem

12/08/2012 18:41:13
Quote Anchor link
Hallo leden,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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)){


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
 
PHP hulp

PHP hulp

05/11/2024 16:30:27
 
Erwin H

Erwin H

12/08/2012 18:47:08
Quote Anchor link
In de eerste plaats dien je een GROUP BY uit te voeren over alle kolommen die niet komen uit een aggregate functie. Dus in jouw geval zou de GROUP BY het volgende moeten zijn:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
GROUP BY users.username, users.avatar,users.id

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?
 
Rick kem

rick kem

12/08/2012 18:57:40
Quote Anchor link
Inderdaad zonder limit laat hij wel alles zien, maar ik wil dus de 100 leden met de meeste supermarkten weergeven, en niet alle leden.
 
Erwin H

Erwin H

12/08/2012 18:59:05
Quote Anchor link
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.
 
Rick kem

rick kem

12/08/2012 20:54:31
Quote Anchor link
en hoe doe ik dat?
 
Erwin H

Erwin H

13/08/2012 08:19:37
Quote Anchor link
Een subquery is in feite een soort virtuele tabel die je alleen aanmaakt voor gebruik in je query. Dus je maakt via een normaal select statement een query die je vervolgens behandelt als ware het een tabel. Die kan je dan op eenzelfde manier joinen als een normale tabel:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

13/08/2012 09:09:11
Quote Anchor link
Kleine uitbreiding op Erwins query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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



Toevoeging op 13/08/2012 09:30:21:

Overigens moet dit ook gewoon werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.