mysql group by having

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Koen B

Koen B

14/01/2009 19:54:00
Quote Anchor link
Hallo,

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)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? SELECT * FROM spelers GROUP BY `speler` ?>

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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<? $query = "SELECT id,player,server,time,average_ping,SUM(average_ping),SUM(times),COUNT(player),COUNT(server),AVG(average_ping) AS averages FROM avarages WHERE player LIKE '%$search%'  AND average_ping<'999' GROUP BY `player` HAVING server=1 ORDER BY $order1 $asc LIMIT $limit"; ?>
 
PHP hulp

PHP hulp

26/09/2022 16:48:39
 
Pieter Jansen

Pieter Jansen

14/01/2009 19:57:00
Quote Anchor link
uhm een speler komt toch maar 1 keer voor in je database? Anders heb je ongelooflijke redudantie...

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
 
Joren de Wit

Joren de Wit

14/01/2009 20:00:00
Quote Anchor link
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...
 



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.