Search code examples
phpmysqlpdogroupinghtml-select

Issue with grouping results from PDO query


I have an issue with a list, I would like to display groups and sub-groups (sgroups), something like:

GROUP1
sgroup1-a
sgroup1-b
sgroup1-c
sgroup1-d
GROUP2
sgroup2-a
sgroup2-b

But my code returns:

GROUP1
sgroup1-a
GROUP1
sgroup1-b
GROUP1
sgroup1-c
GROUP2
sgroup2-a
GROUP2
sgroup2-b
sgroup1-d

So I have name of groups displayed.

Tables structure:

CREATE TABLE IF NOT EXISTS `groupe` (
`id_hm` int(2) NOT NULL AUTO_INCREMENT,
`groupe_tran` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`onoff` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' COMMENT '0:no, 1:active',
`search` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT 'include in search menu, 0: 0ff, 1: on',
PRIMARY KEY (`id_hm`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=11 ;


CREATE TABLE IF NOT EXISTS `sgroupe` (
`id_bm` int(2) NOT NULL AUTO_INCREMENT,
`id_hm1` tinyint(2) NOT NULL COMMENT 'head menu id',
`sgroupe_tran` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`sgroupe_en` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
`onoff` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '1' COMMENT '0:no, 1:active',
`search` enum('0','1') COLLATE utf8_unicode_ci NOT NULL DEFAULT '0' COMMENT 'include in search menu, 0: 0ff, 1: on',
PRIMARY KEY (`id_bm`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=49 ;

Query and PHP code:

$sSel = 'SELECT DISTINCT(groupe_tran), sgroupe_tran FROM groupe JOIN sgroupe ON groupe.id_hm = sgroupe.id_hm1 WHERE groupe.search = "1" AND sgroupe.search = "1" AND groupe.onoff = "1" AND sgroupe.onoff = "1"';

$sReq = $connexion->query($sSel);
$sRes = $sReq->fetchAll();

echo '<select name="groupe">';
foreach ($sRes as $sV) {

    $groupe_tran = $sV['groupe_tran'];
    $sgroupe_tran = $sV['sgroupe_tran'];

    echo '<option value="' . $groupe_tran . '">' . $groupe_tran . '</option>';
    echo '<option value="' . $sgroupe_tran . '">' . $sgroupe_tran . '</option>';
}
echo '</select>';

Solution

  • Assuming that $groupe_tran is your GROUP1/GROUP2 value, you can save the previous $groupe_tran and check if the current value is not the same -

    $sSel = 'SELECT DISTINCT(groupe_tran), sgroupe_tran FROM groupe JOIN sgroupe ON groupe.id_hm = sgroupe.id_hm1 WHERE groupe.search = "1" AND sgroupe.search = "1" AND groupe.onoff = "1" AND sgroupe.onoff = "1"';
    
    $sReq = $connexion->query($sSel);
    $sRes = $sReq->fetchAll();
    
    // create a previous value
    $previous_groupe_tran = '';
    
    echo '<select name="groupe">';
    foreach ($sRes as $sV) {
    
        $groupe_tran = $sV['groupe_tran'];
        $sgroupe_tran = $sV['sgroupe_tran'];
    
        // check if current matches previous, and only print if no match    
        if($groupe_tran != $previous_groupe_tran){
    
            echo '<option value="' . $groupe_tran . '">' . $groupe_tran . '</option>';
    
            // set previous to current
            $previous_groupe_tran = $groupe_tran;
        }
    
        echo '<option value="' . $sgroupe_tran . '">' . $sgroupe_tran . '</option>';
    }
    echo '</select>';