简体   繁体   English

如何在PHP MySQL JOIN结果上分组?

[英]How to group on PHP MySQL JOIN results?

Expected result: 预期结果:

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



SQL: 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:

<?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: 
SELECT a.name, GROUP_CONCAT(b.name) ... WHERE a.group = '' GROUP BY a.name

In summary, you need a GROUP BY clause, and the grouped column needs to be aggregated in some way (otherwise you will get only one value). 总之,您需要一个GROUP BY子句,并且grouped列需要以某种方式聚合(否则,您将只获得一个值)。 If this doesn't work, you can easily do it in PHP code with the results you got: 如果这不起作用,您可以使用得到的结果在PHP代码中轻松完成此操作:

$fruits = array();
while ($row = fetch($query)) {
   //Can be skipped, but you will get notices
   if (!isset($fruits[$row['group']]) {
      $fruits[$row['group']] = array();
   }
   $fruits[$row['group']] = $row['name'];
}

Thanks @ExplosionPills discovering me about MySQL GROUP_CONCAT I have updated my snippet that returns the expected result: 感谢@ExplosionPills发现我有关MySQL GROUP_CONCAT我已更新了返回预期结果的代码段:

<?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: SQL结果:

Showing rows 0 - 2 ( 3 total, Query took 0.0004 sec). 显示第0-2行(共3行,查询耗时0.0004秒)。

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

PHP result: PHP结果:

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

Everyone is welcome for any better implement with better improvement? 欢迎大家进行更好的改进和改进?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM