Ik krijg te veel records terug

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Loek Lemmens

Loek Lemmens

22/05/2020 00:16:15
Quote Anchor link
Goede avond,


persons
idname
1bart
2marloes


hobbys
idpersonidhobby
11voetbal
21tekenen
31lego
42knutselen
52netflix


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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'"
;
?>


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)
PHP script in nieuw venster Selecteer het PHP script
1
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"
;
?>


- 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
 
PHP hulp

PHP hulp

29/03/2024 15:47:25
 
Ozzie PHP

Ozzie PHP

22/05/2020 02:40:11
Quote Anchor link
Waarom vraag je in de query überhaupt de naam op terwijl je die al weet ;)
 
Adoptive Solution

Adoptive Solution

22/05/2020 08:16:03
Quote Anchor link
Het meervoud van hobby is hobbies.
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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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';
}

?>
 
Rob Doemaarwat

Rob Doemaarwat

22/05/2020 10:54:36
Quote Anchor link
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 ;-)
 
- SanThe -

- SanThe -

22/05/2020 14:59:58
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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"
;
?>


Is het niet gewoon dit:
INNER JOIN hobbys ON persons.id = hobbys.personid
 
Thomas van den Heuvel

Thomas van den Heuvel

22/05/2020 15:07:25
Quote Anchor link
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

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?
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.