2

期待される結果:

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');

現在の 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);
}

?>

現在の結果:

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

2 に答える 2

2
SELECT a.name, GROUP_CONCAT(b.name) ... WHERE a.group = '' GROUP BY a.name

要約すると、GROUP BY句が必要であり、グループ化された列を何らかの方法で集約する必要があります(そうしないと、値が1つだけ取得されます)。これが機能しない場合は、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'];
}
于 2012-06-27T18:56:23.750 に答える
2

@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 の結果:

行 0 ~ 2 を表示しています (合計 3 行、クエリには 0.0004 秒かかりました)。

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

PHP の結果:

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

より良い改善を伴うより良い実装を歓迎しますか?

于 2012-06-28T08:44:17.690 に答える