Search code examples
phpmysqljoingroup-bygroup-concat

How to group on PHP MySQL JOIN results?


Expected result:

Berries: blueberry, raspberry, strawberry
Citrus: grapefruit, lime
Pear



SQL:

CREATE TABLE IF NOT EXISTS `fruits` (
  `id` varchar(8) NOT NULL,
  `group` varchar(8) NOT NULL,
  `name` varchar(250) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `fruits` (`id`, `group`, `name`) VALUES
('03E7', '', 'Berries'),
('0618', '03E7', 'blueberry'),
('051B', '03E7', 'raspberry'),
('02AA', '03E7', 'strawberry'),
('035F', '', 'Citrus'),
('07A5', '035F', 'grapefruit'),
('0633', '035F', 'lime'),
('05E1', '', 'Pear');

Current PHP:

<?php

header("Content-Type: text/plain");

mysql_connect("localhost", "root", "");
mysql_select_db("test");

$query = mysql_query("SELECT a.name as `group`, b.name as name FROM fruits a LEFT JOIN fruits b ON b.`group` = a.id WHERE a.`group` = ''");

if ($query) {
    while ($row = mysql_fetch_array($query)) {
        echo $row['group'] . ': ' . $row['name'] . "\n";        
    }
    mysql_free_result($query);
}

?>

Current result:

Berries: blueberry
Berries: raspberry
Berries: strawberry
Citrus: grapefruit
Citrus: lime
Pear: 

Solution

  • Thanks @ExplosionPills discovering me about MySQL GROUP_CONCAT I have updated my snippet that returns the expected result:

    <?php
    
    $query = mysql_query("SELECT a.name as `group`, GROUP_CONCAT(b.name ORDER BY b.name SEPARATOR ', ') as name FROM fruits a LEFT JOIN fruits b ON b.`group` = a.id WHERE a.`group` = '' GROUP BY a.name");
    
    if ($query) {
        while ($row = mysql_fetch_array($query)) {
            $group = $row['group'];
            $name  = $row['name'];
    
            if (isset($name)) {
                echo $group . ': ' . $name . "\n";
            } else  {
                echo $group . "\n";
            }
        }
        mysql_free_result($query);
    }
    
    ?>
    

    SQL result:

    Showing rows 0 - 2 ( 3 total, Query took 0.0004 sec).

    group   | name
    --------+--------
    Berries | blueberry, raspberry, strawberry
    Citrus  | grapefruit, lime
    Pear    | NULL
    

    PHP result:

    Berries: blueberry, raspberry, strawberry
    Citrus: grapefruit, lime
    Pear
    

    Everyone is welcome for any better implement with better improvement?