Ik heb het idee dat ik gillend gek word. Ik ben absoluut geen SQL guru, maar ik dacht niet dat dit zo moeilijk zou moeten zijn.
Ik heb een koppeltabel userGames die er zo uit ziet:
(de games zijn eigenlijk id's en geen naampjes, maar het lijkt me zo makkelijker dan met getallen)
nu wil ik voor de user met id 1 een tabel met voor alle users een lijst met de union van de games tussen die user en user 1: (1 zou ook met zichzelf kunnen joinen, dat boeit me verder niet zo)
Eigenlijk wil ik een count, maar deze is dan makkelijk door gewoon te groupen op de userId en de games te tellen.
voor 2 users is het simpel met de union operator:
Maar ik krijg dit op geen zinnige manier in een subquery, dus daar ben ik maar vanaf gestapt.
Het probleem wat ik echter krijg met self-joins is dat ik alle permutaties krijg, terwijl ik juist alleen de unieke combinaties wil. Voor user 2 krijg je met een cross join met user 1 bijvoorbeeld:
De dubbelen (Diablo = Diablo) zijn er makkelijk uit te halen, maar de combinaties krijg je er niet zomaar uit met een DISTINCT. Ik heb geen idee of ik te moeilijk aan het denken ben, maar ik kom er gewoon niet uit.
Het verste wat ik kom is zoiets:
Waarbij je dus alle games van ug2 krijgt die niet in ug1 zitten, maar daar zouden alle games uit ug1 dus nog bij moeten. Ik heb het idee dat het echt niet moeilijk moet zijn en dat ik compleet verkeerd aan het denken ben, maar het lukt gewoon niet.
Een intersection is bijvoorbeeld goed te doen:
Een union van de games kan dan toch niet zo moeilijk zijn?
Het betreft trouwens een PostgreSQL database.
Ik heb een koppeltabel userGames die er zo uit ziet:
id | userId | game |
---|---|---|
1 | 1 | Diablo |
2 | 1 | Warcraft |
3 | 1 | Starcraft |
4 | 2 | Diablo |
5 | 2 | Warcraft |
6 | 2 | Civilization |
7 | 3 | Warcraft |
8 | 3 | Halo |
(de games zijn eigenlijk id's en geen naampjes, maar het lijkt me zo makkelijker dan met getallen)
nu wil ik voor de user met id 1 een tabel met voor alle users een lijst met de union van de games tussen die user en user 1: (1 zou ook met zichzelf kunnen joinen, dat boeit me verder niet zo)
userId | game |
---|---|
2 | Diablo |
2 | Warcraft |
2 | Starcraft |
2 | Civilization |
3 | Diablo |
3 | Warcraft |
3 | Starcraft |
3 | Halo |
Eigenlijk wil ik een count, maar deze is dan makkelijk door gewoon te groupen op de userId en de games te tellen.
voor 2 users is het simpel met de union operator:
SQL:
1
2
3
| SELECT ug1.game FROM userGames AS ug1 WHERE userId = 1 UNION SELECT ug2.game FROM userGames AS ug2 WHERE userId = 2 |
Maar ik krijg dit op geen zinnige manier in een subquery, dus daar ben ik maar vanaf gestapt.
Het probleem wat ik echter krijg met self-joins is dat ik alle permutaties krijg, terwijl ik juist alleen de unieke combinaties wil. Voor user 2 krijg je met een cross join met user 1 bijvoorbeeld:
user1.game | user2.game |
---|---|
Diablo | Diablo |
Starcraft | Civilization |
Diablo | Warcraft |
Warcraft | Civilization |
Starcraft | Diablo |
Diablo | Civilization |
Warcraft | Diablo |
Starcraft | Warcraft |
De dubbelen (Diablo = Diablo) zijn er makkelijk uit te halen, maar de combinaties krijg je er niet zomaar uit met een DISTINCT. Ik heb geen idee of ik te moeilijk aan het denken ben, maar ik kom er gewoon niet uit.
Het verste wat ik kom is zoiets:
SQL:
1
2
3
4
5
6
7
8
9
10
11
| SELECT ug2.game as bid, ug2.userId as uid FROM userGames ug1 CROSS JOIN userGames ug2 WHERE ug1.userId = 1 AND ug2.game NOT IN (SELECT game FROM userGames as ug3 WHERE ug3.userId = 1) ORDER BY ug2.userId |
Waarbij je dus alle games van ug2 krijgt die niet in ug1 zitten, maar daar zouden alle games uit ug1 dus nog bij moeten. Ik heb het idee dat het echt niet moeilijk moet zijn en dat ik compleet verkeerd aan het denken ben, maar het lukt gewoon niet.
Een intersection is bijvoorbeeld goed te doen:
SQL:
1
2
3
4
5
6
7
8
9
10
| SELECT ug2.userId as userId, count(ug2.game) as intersectionCount FROM userGames AS ug1, userGames AS ug2 WHERE ug1.userId = 1 AND ug1.game = ug2.game GROUP BY ug1.userId, ug2.userId |
Een union van de games kan dan toch niet zo moeilijk zijn?
Het betreft trouwens een PostgreSQL database.