0

私が説明する最善の方法は、例を挙げて説明することです

Table 1
ID | name        | class
-------------------------
 1 | first name  | a
 2 | second name | b

 Table 2
 ID | name_id | meta_key    | meta_value              |
-------------------------------------------------------
 1  | 1       | image       | someImage.jpg           |
 2  | 1       | description | very long description   |
 3  | 2       | image       | someImage_2.jpg         |
 4  | 2       | description | very long description 2 |

表 1 から名前とクラスを選択しようとしています。またname_id、ID (表 1) と同じ表 2 のすべてのレコードも選択しようとしています。

これが私が今持っているクエリです:

SELECT
    table1.name,
    table1.class,
    table2.name_id,
    table2.meta_key,
    table2.meta_value                    
FROM 
    table1 
LEFT JOIN 
   table2 ON ( table1.ID = table2.name_id )           
WHERE 
   table1.ID = '2'

これは機能し、name_id = 2 を持つ表 2 のエントリと同じ数の要素を持つ配列を返します。

最初のテーブルの結果を 1 つ含む配列と、2 番目のテーブルの結果を含む別の配列を返す方法はありますか?

更新: 理想的な結果は次のようになります: $result['table1'][0] = array('name' => 'second name', 'class' => 'b')

$result['table2'][0] = array('name_id' => 2, 
                             'meta_key' => 'image', 
                             'meta_value' => 'someImage_2.jpg')
$result['table2'][1] = array('name_id' => 2, 
                             'meta_key' => 'description', 
                             'meta_value' => 'very long description 2')

それが理にかなっていることを願っています。

4

2 に答える 2

0

SQLでそれを行う方法があるとは思いませんが、PHPで一般的に実行できるように、各テーブルにラベルを付けます。

SELECT
  ':table1',
    table1.name,
    table1.class,
  ':table2',
    table2.name_id,
    table2.meta_key,
    table2.meta_value
FROM ...

個人的にはこれを行うだけですが。

SELECT 'table1', table1.*, ':table2', table2.*
FROM ...

これにより、クライアントとサーバー間で行全体を簡単に複製できるようになり、新しいフィールドを追加する際のメンテナンスが軽減されます。

ただし、クエリでは、返される行ごとに table1 を複製しているため、おそらくこれの方がよいでしょう。

SELECT
  table1.*,
  table2a.meta_value AS image,
  table2b.meta_value AS description
FROM
  table1
LEFT JOIN
  table2 AS table2a ON ( table1.ID = table2a.name_id AND table2a.meta_key = 'image' )
LEFT JOIN
  table2 AS table2b ON ( table1.ID = table2b.name_id AND table2b.meta_key = 'description' )
WHERE 
  table1.ID = '2'
于 2013-12-14T20:53:05.470 に答える