0

以下のような 2 つのテーブルを設定しています。各エントリの連想配列とそれに関連するフィールドを返すには、どの MySQL クエリを使用する必要がありますか? さまざまな JOIN を試しましたが、それらはすべて 2 番目のテーブルのすべての項目に対して結果を返します。最終的に、最初のテーブルの項目ごとに 1 つの子配列を持つ親配列が必要です。各子配列には、テーブル A の名前と、テーブル B のそれに属するすべてのフィールド (B.entryID = A.ID) が含まれます。

A
ID    |Name    |Created
1     Jeff     2013-20-12
2     Bob      2011-23-14

B
ID    |Value   |FieldID    |entryID
1     U.S      1            1
2     91725    2            1
3     China    1            2

望ましい構造

Array
(
    [0] => Array
        (
            [0] => Jeff
            [1] => U.S
            [2] => 91420
        )

    [1] => Array
        (
            [0] => Bob
            [1] => China
            [2] => 
        )

)
4

2 に答える 2

0
SELECT A.Name, B.Value from A LEFT JOIN B on A.ID=B.entryID
于 2013-09-26T07:15:47.800 に答える
0

さて、これを行うにはいくつかの方法があります...

方法 1

配列ビットを取り出して、データをより適切に処理する場合、これを行う正しい方法は次のようになります。

SELECT `A`.`ID`, `A`.`Name`, `B`.`Value`
FROM A
INNER JOIN
  `B` ON `A`.`ID` = `B`.`entryID`
ORDER BY `A`.`ID`, `B`.`Value`

これにより、次のような結果が返されます。

array(
  0 => array(ID=>1, Name=>'Jeff', Value=>'U.S'),
  1 => array(ID=>1, Name=>'Jeff', Value=>'91725'),
  2 => array(ID=>2, Name=>'Bob',  Value=>'China')
)

そのように反復します(これを変更して、文字列にエコーするのではなく、目的の配列構造を作成できます...):

$mysqli = new mysqli(...);//Make your db connection
$query  = $mysqli->query("
    SELECT `A`.`ID`, `A`.`Name`, `B`.`Value`
    FROM A
    INNER JOIN
      `B` ON `A`.`ID` = `B`.`entryID`
    ORDER BY `A`.`ID`, `B`.`Value`
    ");
$newArr = array();
$lastID = '';
if($query->num_rows){
    while($row = $query->fetch_assoc()){
        if($lastID == $row['ID']){
            end($newArr);
            $key = key($newArr);
            $newArr[$key][] = $row['Value'];
        }
        else{
            $newArr[] = array($row['Name'], $row['Value']);
        }
        $lastID = $row['ID'];
    }
}
var_export($newArr);

/**
Output:

array (
  0 => 
  array (
    0 => 'Jeff',
    1 => 'U.S.',
    2 => '91275',
  ),
  1 => 
  array (
    0 => 'Bob',
    1 => 'China',
  ),
)

*/

方法 2

から配列として出力したい/必要がある場合SQL query、次のようなものをお勧めします。

SELECT
    A.ID, A.Name,
    CONCAT(
      '[',
      GROUP_CONCAT('"', B.Value, '"'),
      ']'
    ) as Values
FROM A
INNER JOIN B ON B.entryID = A.ID
GROUP BY A.ID

次のように出力Valuesされjsonます:

array(
    0=>arryay(ID=>1, Name=> 'Jeff', Values='["U.S.", "91725"]'),
    1=>arryay(ID=>1, Name=> 'Bob',  Values='["China"]')
)

json_decodeでレコードにアクセスするValuesたびに を実行する必要がありますphp。何かのようなもの:

$mysqli = new mysqli(...);//Make your db connection
$query  = $mysqli->query("
    SELECT
        A.ID, A.Name,
        CONCAT(
          '[',
          GROUP_CONCAT('"', B.Value, '"'),
          ']'
        ) as Values
    FROM A
    INNER JOIN B ON B.entryID = A.ID
    GROUP BY A.ID
    ");

$newArr = array();
if($query->num_rows){
    while($row = $query->fetch_assoc()){
        $newArr[] = array($row['Name']);
        end($newArr);
        $key = key($newArr);
        $fieldData = json_decode($row['Values']);
        foreach($fieldData as $value){
            $newArr[$key][] = $value;
        }
    }
}
var_export($newArr);


/**
Output:

array (
  0 => 
  array (
    0 => 'Jeff',
    1 => 'U.S.',
    2 => '91275',
  ),
  1 => 
  array (
    0 => 'Bob',
    1 => 'China',
  ),
)

*/

注:このようにしないことをお勧めします...データがこれを許可する方法で保存されていない場合、あらゆる種類のバグにつながる可能性があるため (たとえば、エンコード/エスケープしていない場合) ")。大量のデータがプルされている場合、問題が発生する可能性もありますB...

于 2013-09-26T08:17:08.000 に答える