2

3 つのフィールドを持つ素敵なスキーマを継承しました: id, field_name, field_value. これで、これがどのように機能するかがわかるでしょう。CMS を介して追加された各フィールドは、新しい行として追加されますが、id 値は一意ではありません。

しかし、各フィールドは個々のエンティティではなく、実際には ID (送信されたフォームのインスタンスを参照する) によってグループ化する必要があります。補足として、このスキーマ パターンが何と呼ばれるか知りたいです。

//example db contents
1    name        Joe Blogs
1    email       joe@example.com
1    programme   sport
2    name        Dave
2    email       dave@example.com
2    programme   art

そしてもちろん、1 つのクエリを使用して、選択したフィールドを id フィールドでグループ化したいと考えています。array( id => array( 'field' => 'value' , 'field' => 'value' ) )などとして出力

通常、私は以下を行いますが、これを行うための純粋な SQL の方法があるかどうかを知りたいです。ループを切り取り、下部で処理します。

$existing = new stdClass;
$sql = "SELECT 'id','field_name','field_value'
                FROM table_name";
$results = $wpdb->get_results( $sql, ARRAY ); //using wordpress btw
        foreach ( $results as $k=>$r )
            $existing[$r['id']][$k] = $r;
4

1 に答える 1

5

集計関数と大文字小文字を使用して、値をピボットできます。

SELECT  ID,
        MAX(CASE WHEN type = 'name' THEN value ELSE NULL end) Name,
        MAX(CASE WHEN type = 'email' THEN value ELSE NULL end) email,
        MAX(CASE WHEN type = 'programme' THEN value ELSE NULL end) programme
FROM table1
GROUP BY ID

SQLFiddleデモ

または、将来、クエリを変更せずに別のタイプを追加することを計画している場合は、プリペアドステートメントを使用できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(CASE WHEN type = ''',
      type,
      ''' then value ELSE NULL end) AS ',
      type
    )
  ) INTO @sql
FROM table1;

SET @sql = CONCAT('SELECT  ID, ', @sql, ' 
                   FROM table1 
                   GROUP BY ID');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SQLFiddleデモ

于 2012-10-23T08:44:11.583 に答える