-1

この構造のテーブルがあります

表1
-------------------------------------------------- -------------------------
メタ ID | post_id | メタキー | メタ値 |
-------------------------------------------------- -------------------------
1234 5 サムネイル URL http://www.domain/thumb.jpg
1235 5 swf_url http://www.domain/flash.swf
1236 5 説明 これは説明です。
1237 6 サムネイル URL http://www.domain/thumb.jpg
1238 6 swf_url http://www.domain/flash.swf
1239 6 説明 これは説明です。
-------------------------------------------------- -------------------------

およびこの構造を持つ別のテーブル

表 2
-------------------------------------------------- --
ID | 投稿タイトル | サムネイル | swf | 説明
-------------------------------------------------- --
5 素晴らしいタイトル NULL NULL NULL
6 スタックオーバーフロー NULL NULL NULL
-------------------------------------------------- --

表 1 のメタ値をコピーして、表 2 WHERE post_id = ID に貼り付ける必要があります。

クエリがどのように見えるかについての洞察は大歓迎です。

4

2 に答える 2

2
UPDATE Table2 t2
INNER JOIN
(
   SELECT
     post_id, 
     MAX(CASE WHEN meta_key = 'thumbnail_url' THEN meta_value END) AS 'thumbnail', 
     MAX(CASE WHEN meta_key = 'swf_url' THEN meta_value END) AS 'swf',
     MAX(CASE WHEN meta_key = 'description' THEN meta_value END) AS 'description'
   FROM Table1
   GROUP BY post_id
) t1 ON t1.post_id = t2.id
SET t2.thumbnail = t1.thumbnail,
    t2.swf       = t1.swf,
    t2.description = t1.description;

SQL フィドルのデモ

于 2013-01-15T10:15:07.817 に答える
1

このタイプのデータ変換は、ピボットと呼ばれます。MySQL にはピボット関数がないため、CASE式で集計関数を使用します。

このプロセスにより、行の値が列に変換されます。この形式のデータを選択するには、次を使用します。

select post_id,
  max(case when meta_key = 'thumbnail_url' then meta_value end) thumbnail,
  max(case when meta_key = 'swf_url' then meta_value end) swf_url,
  max(case when meta_key = 'description' then meta_value end) description
from table1 
-- where post_id = 1
group by post_id;

次に、UPDATEtable2 に:

update table2 t2
left join
(
  select post_id,
    max(case when meta_key = 'thumbnail_url' then meta_value end) thumbnail,
    max(case when meta_key = 'swf_url' then meta_value end) swf_url,
    max(case when meta_key = 'description' then meta_value end) description
  from table1 
  -- where post_id = 1
  group by post_id
) t1
  on t2.id = t1.post_id
set t2.thumbnail = t1.thumbnail,
    t2.swf = t1.swf_url,
    t2.description = t1.description;

デモで SQL Fiddle を参照してください

于 2013-01-15T10:18:47.593 に答える