1

データベースへのクエリが多すぎるのを防ぐためにテーブルを結合しようとしていますが、データが返される方法が気に入りません。

クエリ:

SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id

戻り値は次のようになります。

Array
(
[0] => Array
    (
        [name] => Jim
        [dog_name] => Wolf
    )

[1] => Array
    (
        [name] => Jim
        [dog_name] => Frisky
    )

[2] => Array
    (
        [name] => Tina
        [dog_name] => Pokedot
    )

[3] => Array
    (
        [name] => Tina
        [dog_name] => Spiky
    )
)

代わりに次のようなクエリを返すことは可能ですか?

Array
(
[0] => Array
    (
        [name] => Jim
        [dog_name] => array(Wolf, Frisky)
    )

[1] => Array
    (
        [name] => Tina
        [dog_name] => array(Pokedot, Spiky)
    )
)
4

1 に答える 1

8

最も近い解決策は次のとおりです。

SELECT person.name, GROUP_CONCAT(dog.dog_name) AS dog_names
FROM person JOIN dog ON person.id = dog.person_id
GROUP BY person.id

これは、PHP 配列ではなく、犬の名前のコンマ区切りリストである文字列を返します。explode()アプリケーションコードでその文字列を使用する必要があります。

GROUP_CONCAT() のデフォルトの長さ制限は 1024 文字であり、構成オプションによって制御されることに注意してくださいgroup_concat_max_len


@KonstantinWeitz からのコメントに同意します。RDBMS に最適な処理をさせてから、PHP コードを使用して結果を後処理し、必要な形式にすることは価値があります。

たとえば、説明した配列を返す方法は次のとおりです。

$peoplesdogs = array();
$stmt = $pdo->query("SELECT person.name, dog.dog_name FROM person JOIN dog ON person.id = dog.person_id");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
  $peoplesdogs[$row["name"]]["name"] = $row["name"];
  $peoplesdogs[$row["name"]]["dog_name"][] = $row["dog_name"];
}
return array_values($peoplesdogs);
于 2013-07-01T20:26:14.223 に答える