De situatie: ik probeer een vriendensysteem te bouwen, dus gebruikers kunnen andere gebruikers toevoegen als vriend.
Ik heb een tabel users met de kolommen id, name en emailid. id is uiteraard een uniek nummer, emailid kan meerdere keer voorkomen. Het hoogste id is het actieve account van een gebruiker.
Verder dus een tabel [b]friends[b] met de kolommen emailid1 en emailid2
Nou wil ik voor een gebruiker kijken welke vrienden deze persoon heeft, hierbij moet uiteraard het actieve account komen, dus het hoogste id.
Stel, de persoon heeft emailid 10, dan heb ik deze voorlopige query:
Hier komen prima de id's en namen uit van de gebruikers, maar zoals verwacht niet de goede namen bij de id's. En hier begint het plezier van de groupwise maximum
Ik heb gezocht op GoT naar een oplossing en het antwoord was bijna altijd "lees je eens in over groupwise maximum". Ik was al zover dat ik wist dat het daar op uit zou komen
maar ik vind weinig goede uitleg over hoe ik dit moet aanpakken. Deze link is vrij uitgebreid, maar ik zie daar door de bomen het bos niet meer. 10 voorbeelden waarvan ik vaak niet zie waarom het werkt en hoe ik dit kan toepassen op een dubbele join.
Bij MySQL zelf kom ik ook niet veel verder.
Ik heb al het een en ander geprobeerd:
levert hetzelfde resultaat als hierboven.
levert geen rijen op.
Ik zoek uiteraard geen kant-en-klare oplossing, ik wil graag weten wat ik fout doe en hoe ik dit moet oplossen. Maak ik een denkfout? Snap ik het gewoon niet goed genoeg?
Leesmateriaal en zetjes in de goede richting zijn van harte welkom
Ik heb een tabel users met de kolommen id, name en emailid. id is uiteraard een uniek nummer, emailid kan meerdere keer voorkomen. Het hoogste id is het actieve account van een gebruiker.
Verder dus een tabel [b]friends[b] met de kolommen emailid1 en emailid2
Nou wil ik voor een gebruiker kijken welke vrienden deze persoon heeft, hierbij moet uiteraard het actieve account komen, dus het hoogste id.
Stel, de persoon heeft emailid 10, dan heb ik deze voorlopige query:
SQL:
1
2
3
4
5
6
7
| SELECT MAX(users1.id) AS uid1, users1.name AS name1, MAX(users2.id) AS uid2, users2.name AS name2 FROM friends INNER JOIN users AS users1 ON friends.emailid1 = users1.emailid INNER JOIN users AS users2 ON friends.emailid2 = users2.emailid WHERE emailid1 =10 OR emailid2 =10 GROUP BY emailid1,emailid2 |
Hier komen prima de id's en namen uit van de gebruikers, maar zoals verwacht niet de goede namen bij de id's. En hier begint het plezier van de groupwise maximum
Ik heb gezocht op GoT naar een oplossing en het antwoord was bijna altijd "lees je eens in over groupwise maximum". Ik was al zover dat ik wist dat het daar op uit zou komen
Bij MySQL zelf kom ik ook niet veel verder.
Ik heb al het een en ander geprobeerd:
SQL:
1
2
3
4
5
6
7
8
| SELECT friends.emailid,emailid2,MAX(users1.id AS id1),users1.name AS name1,MAX(users2.id) AS id2,users2.name AS name2 FROM friends LEFT JOIN users AS users1 ON friends.emailid1=users1.emailid LEFT JOIN users AS users2 ON friends.emailid2=users2.emailid WHERE (users1.id=(SELECT MAX(id) FROM users WHERE emailid=10) OR users2.id=(SELECT MAX(id) FROM users WHERE emailid=10)) AND (friends.emailid1=10 OR emailid2=10) GROUP BY emailid1,emailid2 |
levert hetzelfde resultaat als hierboven.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| SELECT emailid1,emailid2, users1.id AS uid1,users1.name AS name1, users2.id AS uid2,users2.name AS name2 FROM friends LEFT JOIN users AS users1 ON friends.emailid1=users1.emailid LEFT JOIN users AS users2 ON friends.emailid2=users2.emailid WHERE users1.id=( SELECT MAX(id) FROM users AS users1 ) OR users2.id=( SELECT MAX(id) FROM users AS users2 ) AND ( emailid1=10 OR emailid2=10 ) |
levert geen rijen op.
Ik zoek uiteraard geen kant-en-klare oplossing, ik wil graag weten wat ik fout doe en hoe ik dit moet oplossen. Maak ik een denkfout? Snap ik het gewoon niet goed genoeg?
Leesmateriaal en zetjes in de goede richting zijn van harte welkom
Full-stack webdeveloper in Groningen