meerdere JOIN's in een query met COUNT()

Status
Niet open voor verdere reacties.

That Guy

Meubilair
Lid geworden
28 nov 2006
Berichten
5.010
Hallo allemaal,



Ik ben bezig met een stukje forum-software in PHP. Nu is het idee om zo min mogelijk queries te gebruiken, dus was ik van plan een mooie JOIN te gebruiken om meerdere queries tot een te maken.

Dit zijn de originele queries:
[SQL]SELECT user_id, time, text
FROM posts
WHERE id = 2[/SQL]
[SQL]ELECT ranks.title, users.id, users.name, users.rank, users.avatar, users.membersince, users.country
FROM users
LEFT JOIN ranks ON users.rank = ranks.id
WHERE users.id = "hier t user_id uit vorrige query"[/SQL]
[SQL]SELECT count(to_user) as count
FROM reputation
WHERE to_user = "hier t user_id uit 1e query"[/SQL]
en dit was mn idee:[SQL]SELECT posts.user_id, posts.time, posts.text,
users.id, users.name, users.rank, users.avatar,users.country,
ranks.title,
COUNT(reputation.to_user) as reptouser
FROM posts
LEFT JOIN users ON users.id = posts.user_id
LEFT JOIN ranks ON ranks.id = users.rank
LEFT JOIN reputation ON reputation.to_user = users.id
WHERE posts.id = 2[/SQL]alleen ik krijg een error; er zit een fout:
Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause


Ik snap wat er staat; maar mijn SQL kennis is niet zo heel goed, en volg niet waarom er een GROUP BY in moet om de COUNT() te laten werken. Wie o wie kan mij vertellen wat er fout gaat, of nog beter, hoe deze wel gaat werken?




:thumb:
 
Laatst bewerkt:
Hallo,

je kunt count (wat een functie is) niet zomaar samen met selectors in je query zetten die geen functies zijn.
count(*) is een functie die de voorkomens telt van de selector die je aangeeft in de group by clause:


stel je wilt per user_id weten hoevaak deze voorkomt, doet men:

SELECT user_id, count(*)
//rest van de query
GROUP BY user_rid

Volgens mij komt het er op neer dat het meegeven van een argument aan count zoals jij dat doet (COUNT(reputation.to_user)) niet mag, ik zie het iig niet staan in mijn naslagwerk.

Ik heb dit ook altijd vreemd gevonden, want een functie zou je logischerwijs argumenten mee moeten kunnen geven, maar zo is de count functie blijkbaar niet gedefinieerd.

mocht het nog niet lukken hoor ik het graag :D
 
Laatst bewerkt:
En dan nu een meer juiste reactie dan de vorige reactie...

Count is een zogenaamde aggregatie functie, net zoals MIN, MAX, SUM.
Als je een aggregatie functie gebruikt moet je aangeven hoe je gegevens gegroepeerd worden.
Dat doe je middels een GROUP BY.
In de GROUP BY moet je alle kolomnamen gebruiken die je in je SELECT opneemt, behalve de kolom waar je de aggregatie functie op los laat.

Tip, gebruik Count(*)s

Tardi
 
Alvast bedankt allebij, voor het kijken naar mn vraag.


Is een COUNT(*) beter/sneller dan een COUNT() met een kolom-waarde?

In de GROUP BY moet je alle kolomnamen gebruiken die je in je SELECT opneemt, behalve de kolom waar je de aggregatie functie op los laat.
bedoel je dat ik dus na de GROUP BY alle velden moet neerzetten, die ik bij de select ook gebruik?! Zo dus?[SQL]GROUP BY posts.user_id, posts.time, posts.text, users.id, users.name, users.rank, users.avatar,users.country, ranks.title[/SQL]is dat niet een beetje... onhandig? :P




:thumb:
 
Ja, maar dan zonder de posts.user_id. want die wil je juist tellen. Of zoals Tardis zei: dat is de kolom waar je de aggregatie functie op los laat.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan