Query probleem JOIN
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
$query = "
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
s.goals
FROM
Leden AS l
LEFT JOIN
Statistieken AS s
ON
(l.id = s.leden_id)
LEFT JOIN
Teamindeling AS t
ON
(t.leden_id = l.id)
LEFT JOIN
Teams AS team
ON
(t.team_id = team.id)
WHERE
team.leeftijd='Senioren'
AND
l.spelend = 'X'
AND
( s.seizoen = '". $seizoen. "' OR s.seizoen IS NULL )
GROUP BY
l.id
ORDER BY
s.goals DESC
";
?>
$query = "
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
s.goals
FROM
Leden AS l
LEFT JOIN
Statistieken AS s
ON
(l.id = s.leden_id)
LEFT JOIN
Teamindeling AS t
ON
(t.leden_id = l.id)
LEFT JOIN
Teams AS team
ON
(t.team_id = team.id)
WHERE
team.leeftijd='Senioren'
AND
l.spelend = 'X'
AND
( s.seizoen = '". $seizoen. "' OR s.seizoen IS NULL )
GROUP BY
l.id
ORDER BY
s.goals DESC
";
?>
Helaas geeft hij geen resultaat als s.seizoen niet bestaat, terwijl ik dan eigenlijk 0 terug wil krijgen.
Kan iemand mij vertellen waar het fout loopt?
Gewijzigd op 05/06/2013 19:20:16 door D B
Gewijzigd op 05/06/2013 20:35:41 door Aad B
Mijn statistieken tabel ziet er zo uit
STATISTIEKEN
leden_id
goals
seizoen
Dit is mijn query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?
$query = "
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
s.goals
FROM
Leden AS l
LEFT JOIN
Statistieken AS s
ON
(l.id = s.leden_id)
LEFT JOIN
Teamindeling AS t
ON
(t.leden_id = l.id)
LEFT JOIN
Teams AS team
ON
(t.team_id = team.id)
WHERE
team.leeftijd='Senioren'
AND
l.spelend = 'X'
AND
t.seizoen = '". $seizoen. "'
GROUP BY
l.id
ORDER BY
s.goals DESC
";
?>
$query = "
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
s.goals
FROM
Leden AS l
LEFT JOIN
Statistieken AS s
ON
(l.id = s.leden_id)
LEFT JOIN
Teamindeling AS t
ON
(t.leden_id = l.id)
LEFT JOIN
Teams AS team
ON
(t.team_id = team.id)
WHERE
team.leeftijd='Senioren'
AND
l.spelend = 'X'
AND
t.seizoen = '". $seizoen. "'
GROUP BY
l.id
ORDER BY
s.goals DESC
";
?>
Hij toont nu dus alle namen, alleen staat er bij bijvoorbeeld mij 2 goals, terwijl die uit een ander seizoen zijn. Als ik deze weg laat: dus s.seizoen = 'DitSeizoen' toevoegen, krijg ik heel mijn naam niet meer te zien.
Begrijp je?
Alvast bedankt voor de hulp
LEFT JOIN
Statistieken AS s
in
LEFT OUTER JOIN
Statistieken AS s
Gewijzigd op 05/06/2013 20:37:51 door Aad B
Maar nu verander ik mijn seizoen naar 2013/2014 en nu krijg ik alle mensen te zien, behalve de mensen die bij seizoen 2012/2013 al goals hebben staan.
Deze spelers moeten eigenlijk dus ook weer gewoon zichtbaar worden.
Aad B op 05/06/2013 20:36:29:
Ga terug naar je eerste query en verander
LEFT JOIN
Statistieken AS s
in
LEFT OUTER JOIN
Statistieken AS s
LEFT JOIN
Statistieken AS s
in
LEFT OUTER JOIN
Statistieken AS s
Aad, dat heeft geen enkel effect. OUTER is optioneel en maakt dus geen enkel verschil.
@D B
Probeer dit eens:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
COALESCE(s.goals, 0) AS goals
FROM
Leden AS l
LEFT JOIN
statistieken AS s
ON l.id = s.leden_id AND s.seizoen = '2013/2014'
l.id,
l.voornaam,
l.achternaam,
team.team,
COALESCE(s.goals, 0) AS goals
FROM
Leden AS l
LEFT JOIN
statistieken AS s
ON l.id = s.leden_id AND s.seizoen = '2013/2014'
En dan de rest van je query
Nu vraag ik me nog 1 ding af:
Zoals jullie zien heb ik nogal wat JOINS in mijn query, is het niet mogelijk om tabellen standaard aan elkaar te koppelen? Of is dit normaal? Of is mijn structuur waarschijnlijk zeer minimaal waardoor ik veel JOINS nodig heb?
Bedankt Ger, en Aad natuurlijk ook voor het meedenken!
Een view definieer je op je database en vanaf het moment dat je de view hebt aangemaakt kan je die gewoon gebruiken:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
CREATE VIEW v_leden AS
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
COALESCE(s.goals, 0) AS goals
FROM
Leden AS l
LEFT JOIN
statistieken AS s
ON l.id = s.leden_id AND s.seizoen = '2013/2014';
SELECT
l.id,
l.voornaam,
l.achternaam,
team.team,
COALESCE(s.goals, 0) AS goals
FROM
Leden AS l
LEFT JOIN
statistieken AS s
ON l.id = s.leden_id AND s.seizoen = '2013/2014';
vervolgens kan je de kolommen uit de view selecteren al ware het een normale tabel:
Let wel dat je in een view geen variabele op kunt nemen. Bovenstaande view zou dus alleen voor seizoen 2013/2014 zijn, wat je normaal gesproken waarschijnlijk niet wilt hebben. Zou je namelijk een ander seizoen willen hebben dan kan je de view niet meer gebruiken.
D B op 06/06/2013 17:40:57:
Zoals jullie zien heb ik nogal wat JOINS in mijn query, is het niet mogelijk om tabellen standaard aan elkaar te koppelen? Of is dit normaal? Of is mijn structuur waarschijnlijk zeer minimaal waardoor ik veel JOINS nodig heb?
3 is niet veel ;-), ik heb wel eens query's met 10 of meer joins.
Zoals Erwin al aangaf is een view een optie, maar niet altijd een goede optie.
MySQL kent geen materialized views, dus een view kan niet worden geïndexeerd.