SQL INNER JOIN meerder tabellen
Ik heb een klein probleempje bij het weergeven van data uit meerdere tabellen.
Momenteel is dit mijn code:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
$query = "SELECT
//ophalen tal van data die wel werkt
SUM(o.status = 'afgewerkt') AS oefn,
SUM(b.status = 'afgewerkt') AS begripn
FROM users AS u
LEFT JOIN ll AS l
ON (u.inlog = l.inlog)
LEFT JOIN oef AS o
ON (u.inlog = o.speler)
LEFT JOIN beg AS b
ON (u.inlog = b.speler)
WHERE
code = '$code'
GROUP BY u.inlog";
//ophalen tal van data die wel werkt
SUM(o.status = 'afgewerkt') AS oefn,
SUM(b.status = 'afgewerkt') AS begripn
FROM users AS u
LEFT JOIN ll AS l
ON (u.inlog = l.inlog)
LEFT JOIN oef AS o
ON (u.inlog = o.speler)
LEFT JOIN beg AS b
ON (u.inlog = b.speler)
WHERE
code = '$code'
GROUP BY u.inlog";
Daarbij heb ik 4 tabellen,
users users, waar de normale gegevens van de gebruiker wordt opgeslagen,
ll waar een code staat gekoppeld aan een spel en enkele gegevens van het spel,
oef en beg zijn 2 tabellen die heel veel records bevatten,
wat ik nu probeer is uit beg en oef de records te tellen die als speler dezelfde naam hebben als hun inlog, maar ook status afgewerkt hebben. De query geeft geen fout melding, maar de SQL telt veel meer records dan dat er eigenlijk zijn. En er is geen regelmaat in, een speler die 3 rijen heeft met zijn inlog en status afgewerkt, komt er te voorschijn dat hij 45 rijen gevonden heeft ... .
Kan iemand mij helpen?
Alvast bedankt!
Gewijzigd op 17/09/2014 17:07:50 door Jos Verstraeten
Kan het zijn dat je de verkeerde JOIN hebt (LEFT)?!
GROUP BY u.inlog
geeft aan dat er naast die 2 sum() regels hooguit 1 andere regel is, en daarin staat u.inlog.
Enige wat er verder bij zou mogen, zouden andere agregatie functies als sum(), count() of avg() zijn.
http://wiki.pfz.nl/group-by
Ik zal daar eens mee proberen spelen, Obelix ben wel vrij zeker dat het LEFT moet zijn omdat sommige date wel correct verschijnt ...
Als in de eerste tabel die gejoined wordt 3 records staan dan is het tussenresultaat 3 records met die login. Bv:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
+---------+---------+
| u.login | l.login |
+---------+---------+
| Jos | Jos |
+---------+---------+
| Jos | Jos |
+---------+---------+
| Jos | Jos |
+---------+---------+
| u.login | l.login |
+---------+---------+
| Jos | Jos |
+---------+---------+
| Jos | Jos |
+---------+---------+
| Jos | Jos |
+---------+---------+
Met dat tussenresultaat wordt verder gewerkt, dus als in de volgende tabel weer 3 records staan voor 'Jos',
dan heb je in totaal al 9 records