mysql group by having
ik probeer een script te maken die bijhoud welke speler er in welke server speelt. Nu heb ik ongeveer zo'n database:
-id
-speler
-server
Nu kan een speler is meerdere servers spelen en komt een speler dus ook meerdere keren voor in de database. Ik gebruik dan ongeveer een query als: (de echte is vrij lang)
Nu krijg ik keurig alle spelers, en met COUNT(player) kan ik zien in hoeveel servers hij speelt.
Nu wil ik dat ik kan sellecteren op server, dus heb ik aan 2 dingen gedacht:
Code (php)
1
2
3
4
2
3
4
<?
SELECT * FROM spelers WHERE server = '$server' GROUP BY `speler`
SELECT * FROM spelers GROUP BY `speler` HAVING server = '$server'
?>
SELECT * FROM spelers WHERE server = '$server' GROUP BY `speler`
SELECT * FROM spelers GROUP BY `speler` HAVING server = '$server'
?>
Bij de eerste gaat dit goed, het punt is alleen dat COUNT(player) dan niet meer werkt, het aantal servers is nog maar 1 terwijl dit meer hoort te zijn omdat WHERE alle andere gefiltert heeft.
Bij HAVING gaat dit ook niet goed. Als ik daar 3 (server 3) invul krijg ik mezelf te zien, maar als ik daar 1 invul zie ik mezelf niet. Terwijl ik met server 1 en 3 beide in de database sta. Wat doe ik verkeert? :o
Owjah, mocht het nuttig zijn, dit is me hele query:
wat ik zou doen is je DB model aan passen en 2 tabellen maken..
tabel: speler
speler_id
naam
tabel:server
server_id
speler_id
servernaam
en dan kun je makkelijk kijken welke spelers in welke servers zitten.
bovendien voorkom je redudantie
Het juiste gebruik van GROUP BY
Voordat je verder gaat, zou ik bovenstaande handleiding goed doorlezen. De manier waarop jij GROUP BY in die queries gebruikt is namelijk niet correct en je queries zijn dan ook hardstikke ongeldig! Dat MySQL ze wel accepteert en random resultaten teruggeeft, is een ander verhaal.
Het probleem waar je nu tegen aanloopt, wordt waarschijnlijk veroorzaakt door een ander veel groter probleem: een incorrect datamodel. Als je tabel 'averages' de enige tabel is die je gebruikt, gaat er inderdaad iets niet goed. Ga in dat geval eerst normaliseren en zorg dat je met een correct datamodel verder gaat. Dan is hetgeen jij nu wilt waarschijnlijk met een paar eenvoudige queries op te lossen...
Voordat je verder gaat, zou ik bovenstaande handleiding goed doorlezen. De manier waarop jij GROUP BY in die queries gebruikt is namelijk niet correct en je queries zijn dan ook hardstikke ongeldig! Dat MySQL ze wel accepteert en random resultaten teruggeeft, is een ander verhaal.
Het probleem waar je nu tegen aanloopt, wordt waarschijnlijk veroorzaakt door een ander veel groter probleem: een incorrect datamodel. Als je tabel 'averages' de enige tabel is die je gebruikt, gaat er inderdaad iets niet goed. Ga in dat geval eerst normaliseren en zorg dat je met een correct datamodel verder gaat. Dan is hetgeen jij nu wilt waarschijnlijk met een paar eenvoudige queries op te lossen...