Archief - SQL: query probleem (Syntax)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

=(X)=RaVen=

Legacy Member
Kweet, 't is een schande, maar ik geraak er niet uit :f
Situatie is als volgt:
Tabel:
Code:
+---------+
| Members |
+---------+
| id      |
| status  |
| ...     |
+---------+

+--------------+
| member_alias |
+--------------+
| id           |
| memberID     |
| nick         |
+--------------+

+--------------+
| member_round |
+--------------+
| id           |
| aliasID      |
| roundID      |
+--------------+
Ik heb dus leden, maar die kunnen meerdere namen hebben gehad over de tijden
we spelen wedstrijden en iedere "map, ronde, whatever" is 1 round.

Nu wil ik een overzicht tonen van mijn actieve leden. (status < 4 = actief)
Maar als zo een lid dus meerdere namen heeft wil ik degene tonen die het meest is gebruikt.

Dus bv;
Ik ben RaVen & vroeger Raafje
Ik heb 82 keer met de naam RaVen gespeeld
en 32 keer met de naam Raafje
Dus wil ik in het overzicht de nickname RaVen tonen.

Ik had al zoiets:
PHP:
$sql  = "SELECT ma.nick, ma.memberID, COUNT(mr.roundID) As Aantal ";
$sql .= "FROM member_alias ma, member_round mr, members m ";
$sql .= "WHERE mr.memberID=ma.memberID AND ma.memberID=m.id AND m.status < 4 ";
$sql .= "GROUP BY ma.memberID ";
$sql .= "ORDER BY ma.nick";
Het probleem hiermee is dat als een lid nog geen "maps, rondes" heeft gespeeld hij ook helemaal niet
in de resultset komt :<
En dat het me niet lukt de juiste nick te tonen (als er meer zijn) (hij kiest degene met het laagste ID)

Als iemand dit zou kunnen oplossen, hartelijk dank dan :)

Met vriendelijke groet
=(X)=RaVen=

Cakeman

Legacy Member
Ik geloof dat je dit zal moeten oplossen met subqueries maar dacht dat MySQL dit niet ondersteunde (ondertussen misschien al wel).

-mkz.lama-

Legacy Member
idd, join is handiger

gebruik:
FROM tab1 JOIN tab2 ON voorwaarde

ipv:
FROM tab1,tab2
WHERE voorwaarde

Het probleem met die leden die niet voorkomen in het resultaat heeft te maken (denkek) met het feit dadde dus tab1,tab2 in de FROM gebruikt ipv ne JOIN (resultaten waarin ne kolom met NULL voorkomt worden nie getoond)
OPL: gebruik dus FROM tab1 FULL OUTER JOIN tab2 ON voorwaarde

ps.: syntax bennek nie 100% zeker want tis vant 1e semester geleden dank databanken en gehad :p

MilkSjeik

Legacy Member
LEFT OUTER JOIN is de oplossing om die mens met 0 maps ook te verkrijgen.
Subqueries werken ondertussen wel al in MySql, maar vanaf versie 4.1 geloof ik. De meeste hosts draaien nog versie 3...

Onder een andere omgeving zou ik direct weten hoe deze te schrijven, maar met MySql ben ik niet zo heel vertrouwd...
Code:
SELECT a.nick, a.memberID, COUNT(b.roundID) As Aantal

FROM member_alias a, members c LEFT OUTER JOIN member_round b
ON b.memberID=a.memberID 

AND a.memberID=c.id 
AND c.status < 4

GROUP BY a.memberID, a.nick
ORDER BY a.nick;

=(X)=RaVen=

Legacy Member
Momenteel is het het volgende geworden.
PHP:
$sql  = "SELECT ma.nick, ma.memberID As id, COUNT(mr.roundID) As Aantal ";
$sql .= "FROM member_alias ma, members m LEFT OUTER JOIN member_round mr ";
$sql .= "ON mr.memberID=ma.id ";
$sql .= "WHERE ma.memberID=m.id ";
$sql .= "AND m.status < 4 ";
$sql .= "GROUP BY ma.memberID ";
$sql .= "ORDER BY ma.nick";
Het enige probleem hiermee is dat ik precies die GROUP BY niet kan orderen :<
Ik group op het memberID, maar ik wil de Nick met het meeste gespeelde rondes (de meest gebruikte nickname dus :))

al wreed mercie tot hiertoe :niceone:

-mkz.lama-

Legacy Member
=(X)=RaVen= zei:
Het enige probleem hiermee is dat ik precies die GROUP BY niet kan orderen :<
Ik group op het memberID, maar ik wil de Nick met het meeste gespeelde rondes (de meest gebruikte nickname dus :))

is het niet zo dadde enkel kan ordenen op etgeen in je group by staat?
probeer eens

DarkBone

Legacy Member
-mkz.lama- zei:
is het niet zo dadde enkel kan ordenen op etgeen in je group by staat?
probeer eens

Normaal kunt op gelijk welke kolom ordenen (ook op je aliassen).

killgore

Legacy Member
-mkz.lama- zei:
is het niet zo dadde enkel kan ordenen op etgeen in je group by staat?
probeer eens
wrong :)

jij vergist met het feit dat een GROUP BY automatisch ook ordert :).

=(X)=RaVen=

Legacy Member
Het begint te lukken :)
Eerst ff eten en dan sebiet nogwa prutsen, kzal de oplossing posten alsek ze heb :)

thx

=(X)=RaVen=

Legacy Member
id -> Nick -> aantal
Ik heb nu

6 Joene 1
1 Raafje 1
1 RaVen 169
12 XQuiZ 2
12 XQuiZit 23
6 Zolex 2

Dit is een ORDER BY nick

Kan ik selecteren zodat ik dit krijg?

1 RaVen 169
12 XQuiZiT 23
6 Zolex 2

Ik wil eigenlijk de nicknames tonen in alfabetische volgorde gegroepeerd op memberID zodat de meest gebruikte getoond wordt :(
PHP:
$sql  = "SELECT ma.nick, ma.memberID AS id, COUNT(mr.roundID) AS Aantal, m.email ";
$sql .= "FROM member_alias ma, members m ";
$sql .= "LEFT OUTER JOIN member_round mr ";
$sql .= "ON mr.memberID=ma.id ";
$sql .= "WHERE ma.memberID=m.id AND m.status < 4 ";
$sql .= "GROUP BY ma.memberID ";
$sql .= "ORDER BY m.nick";
Zo toont hij ze alfabetisch met eventueel het aantal rondes erachter, maar ik wil dus nog een extra order by doen op die GROUP BY als da kan :(
Het is voor mySQL...

iemand? :unsure:
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan