Ik krijg te veel records terug
persons
id | name |
1 | bart |
2 | marloes |
hobbys
id | personid | hobby |
1 | 1 | voetbal |
2 | 1 | tekenen |
3 | 1 | lego |
4 | 2 | knutselen |
5 | 2 | netflix |
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'";
?>
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'";
?>
Als ik de naam en de hobbys echo dan word de naam evenveel getoond als hobbys.
Bij bart is dat dus 4x.
Ik heb GROUP BY geprobeerd maar dan krijg ik als resultaat
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'
GROUP BY name";
?>
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'
GROUP BY name";
?>
- bart
- voetbal
De rest van de hobbys word dan weer niet getoond.
Het resultaat zou moeten worden
bart
voetbal
tekenen
lego
Gewijzigd op 22/05/2020 00:17:27 door Loek Lemmens
Waarom vraag je in de query überhaupt de naam op terwijl je die al weet ;)
https://www.merriam-webster.com/dictionary/hobby
Als Bart 3 hobbies heeft en er komen er 4 uit, dan heb je inderdaad teveel records.
Je kan het zo oplossen :
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
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
<?php
$db = new mysqli ( $host, $user, $pass, $base );
$query = "SELECT
p.name as naam,
group_concat(h.hobby) as hobby
FROM
persons p
INNER JOIN
hobbys h
ON
p.id = h.personid
GROUP BY
p.id;";
$result = $db->query( $query );
if( $result )
{
echo '<table border="1">';
while ( $row = $result->fetch_object() )
{
echo '<tr><td>' . $row->naam . '</td><td>';
$hobbies = explode( ',', $row->hobby );
foreach ( $hobbies as $hobby )
{
echo $hobby . '<br />';
}
echo '</td></tr>';
}
echo '</table>';
} else {
'geen result';
}
?>
$db = new mysqli ( $host, $user, $pass, $base );
$query = "SELECT
p.name as naam,
group_concat(h.hobby) as hobby
FROM
persons p
INNER JOIN
hobbys h
ON
p.id = h.personid
GROUP BY
p.id;";
$result = $db->query( $query );
if( $result )
{
echo '<table border="1">';
while ( $row = $result->fetch_object() )
{
echo '<tr><td>' . $row->naam . '</td><td>';
$hobbies = explode( ',', $row->hobby );
foreach ( $hobbies as $hobby )
{
echo $hobby . '<br />';
}
echo '</td></tr>';
}
echo '</table>';
} else {
'geen result';
}
?>
Adoptive Solution op 22/05/2020 08:16:03:
Je kan het zo oplossen
Maar dan wel even onthouden om geen hobby met een komma toe te staan ;-)
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'
GROUP BY name";
?>
$query ="
SELECT persons.name, hobbys.hobby
FROM persons
INNER JOIN hobbys ON persons.id = hobby.personid
WHERE name='bart'
GROUP BY name";
?>
Is het niet gewoon dit:
INNER JOIN hobbys ON persons.id = hobbys.personid
Loek Lemmens op 22/05/2020 00:16:15:
Bij bart is dat dus 4x.
Bart heeft drie hobby's, dus dan zou ik drie records terug verwachten. Of één, als je dingen als GROUP_CONCAT gebruikt.
Loek Lemmens op 22/05/2020 00:16:15:
Het resultaat zou moeten worden
bart
voetbal
tekenen
lego
bart
voetbal
tekenen
lego
Hoe je gegevens ophaalt en presenteert zijn in principe twee verschillende dingen, je hoeft de query niet zo te boetseren dat deze de informatie in de uiteindelijke vorm ophaalt, het voornaamste is dat de query de juiste informatie teruggeeft. Wat nu als je de weergave wilt veranderen? Dan zou je de query mogelijk moeten aanpassen. Ik zou dit dus scheiden. Je kunt in PHP / de presentatielaag altijd nog resultaten anders organiseren, dit hoeft niet (per se) in de query te gebeuren.
@Adoptive waarom eerst een GROUP_CONCAT, en dan een explode? :p
Plus, recent zijn er meerdere topics voorbij gekomen waarin precies hetzelfde gebeurt.
Ook gaan de queries er nu vanuit dat iemand ten minste één hobby heeft. Als dit niet het geval is, is er geen resultaat? Heb je ook nagedacht over dit soort randgevallen?