0

ID でグループ化された 1 つの行に、それぞれの行にあるキー = 値のペアをグループ化しようとしています。

表 1. wp_posts
キー: ID - post_title

表 2. wp_postmeta
キー: post_id、wpcf-owner、wpcf-tel、wpcf-mob、wpcf-email...

このクエリを使用すると、すべての情報を取得できますが、キーごとに個別の行が取得されます。必要なのは、すべてが wp_posts.ID でグループ化された 1 つの行にある配列です。

SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.post_id, wp_postmeta.meta_key, wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'accommodation' AND wp_postmeta.meta_key LIKE 'wpcf%'
ORDER BY hic13_posts.post_title

結果は次のとおりです。

ID | post_title | key value  
------------------------------  
1  |  TITLE     |  wpcf-owner  
1  |  TITLE     |  wpcf-tel  
1  |  TITLE     |  wpcf-mob  
1  |  TITLE     |  wpcf-email  
2  |  TITLE     |  wpcf-owner  
2  |  TITLE     |  wpcf-tel  
2  |  TITLE     |  wpcf-mob  
2  |  TITLE     |  wpcf-email  
...

私が必要とするのは:

ID | post_title | key value  | key value | key value | key value  
-----------------------------------------------------------------  
1  |  TITLE     | wpcf-owner | wpcf-tel  | wpcf-mob  | wpcf-email  
2  |  TITLE     | wpcf-owner | wpcf-tel  | wpcf-mob  | wpcf-email 

ID でグループ化するコマンドを追加すると、2 番目のテーブルからキーが 1 つだけ取得されます...

SELECT wp_posts.ID, wp_posts.post_title, wp_postmeta.post_id, wp_postmeta.meta_key, wp_postmeta.meta_value
FROM wp_posts
JOIN wp_postmeta
ON wp_posts.ID = wp_postmeta.post_id
WHERE wp_posts.post_type = 'accommodation' AND wp_postmeta.meta_key LIKE 'wpcf%'    
GROUP BY hic13_posts.ID
ORDER BY hic13_posts.post_title

これだけもらえる

ID | post_title | key value  
------------------------------  
1  |  TITLE     |  wpcf-owner  
2  |  TITLE     |  wpcf-tel 

これがすべて理にかなっていることを願っています:-)
ありがとう!

4

1 に答える 1

1

このタイプの変換はピボットですが、MySQL にはピボット関数がないため、CASE式で集計関数を使用する必要があります。

SELECT p.ID, 
  p.post_title, 
  m.post_id, 
  max(case when m.meta_key = 'wpcf-owner' then m.meta_value end) as owner,
  max(case when m.meta_key = 'wpcf-tel' then m.meta_value end) as tel,
  max(case when m.meta_key = 'wpcf-mob' then m.meta_value end) as mob,
  max(case when m.meta_key = 'wpcf-email' then m.meta_value end) as email
FROM wp_posts p
JOIN wp_postmeta m
  ON p.ID = m.post_id
WHERE p.post_type = 'accommodation' AND m.meta_key LIKE 'wpcf%'    
GROUP BY p.ID, p.post_title, m.post_id
ORDER BY p.post_title

編集、meta_key変換する項目の数が不明な場合は、準備済みステートメントを使用して動的 SQL を生成できます。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(CASE WHEN m.meta_key = ''',
      meta_key,
      ''' THEN m.meta_value else null END) AS `',
      meta_key, '`'
    )
  ) INTO @sql
FROM wp_postmeta;

SET @sql 
  = CONCAT('SELECT p.ID, 
              p.post_title, 
              m.post_id, ', @sql, ' 
            FROM wp_posts p
            JOIN wp_postmeta m
              ON p.ID = m.post_id
            WHERE p.post_type = ''accommodation'' 
               AND m.meta_key LIKE ''wpcf%''   
            GROUP BY p.ID, p.post_title, m.post_id
            ORDER BY p.post_title');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-03-28T20:23:08.873 に答える