【发布时间】:2017-10-25 14:44:32
【问题描述】:
这很可能以某种方式重复。我查看并尝试了许多找到的答案。我为此苦苦挣扎了好几天,但我无法让它发挥作用,或者弄清楚如何应用我找到的一些示例。
似乎最想将所有列转换为行,这不是我想要的。据我所知,我可能需要的是 unpivot 和/或 UNION?
我正在从 WordPress 表“wp_usermeta”中获取数据。
WordPress 表结构如下:
user_id | meta_key | meta_value
1 | FirstnameA | Klaus
1 | SecondnameA| Reed
1 | FirstnameB | Herbert
1 | SecondnameB| Hall
2 | FirstnameA | Max
2 | SecondnameA| Musterman
....
我需要什么:
ID | Firstname_A | Lastname_A | Adress_A
ID | Firstname_B | Lastname_B | Adress_B
两行将属于同一个 ID。
我当前的查询是什么样的:
SELECT user_id,
MAX(CASE WHEN meta_key='firstnameA' THEN meta_value ELSE null END) FirstnameA,
MAX(CASE WHEN meta_key='lastnameA' THEN meta_value ELSE null END) Lastname_A,
MAX(CASE WHEN meta_key='adressA' THEN meta_value ELSE null END) Adress_A,
MAX(CASE WHEN meta_key='firstnameB' THEN meta_value ELSE null END) FirstnameB,
MAX(CASE WHEN meta_key='lastnameB' THEN meta_value ELSE null END) Lastname_B,
MAX(CASE WHEN meta_key='adressB' THEN meta_value ELSE null END) Adress_B
FROM wp_usermeta
GROUP BY user_id
我的结果是:
ID | Firstname_A | Lastname_A | Adress_A | Firstname_B | Lastname_B | Adress_B
MySQL-版本:5.7
我使用 JOIN for @janh 的方法也可以显示实际的 meta_key:
SET SQL_BIG_SELECTS=1;
select m1.user_id, m1.meta_value as Vorname_M, m2.meta_value as Nachname_M,m3.meta_value as Adresse_M,m4.meta_value as Telefon_M,m5.meta_value as Mail_M,
m6.meta_value as Vorname_V, m7.meta_value as Nachname_V,m8.meta_value as Adresse_V,m9.meta_value as Telefon_V,m10.meta_value as Mail_V,
m11.meta_value as Kinder, m12.meta_value as Kindergeburtstage,
m13.meta_value as Vorname_L, m14.meta_value as Nachname_L,m15.meta_value as Adresse_L,m16.meta_value as Telefon_L,m17.meta_value as Mail_L,
m18.meta_value as Arbeitskreise
from wp_usermeta m1
join wp_usermeta m2 on (m1.user_id = m2.user_id and m2.meta_key = 'nachnamemother')
join wp_usermeta m3 on (m2.user_id = m3.user_id and m3.meta_key = 'adress_mother')
join wp_usermeta m4 on (m3.user_id = m4.user_id and m4.meta_key = 'phone_mother')
join wp_usermeta m5 on (m4.user_id = m5.user_id and m5.meta_key = 'mail_mother')
join wp_usermeta m6 on (m5.user_id = m6.user_id and m6.meta_key = 'first_name_father')
join wp_usermeta m7 on (m6.user_id = m7.user_id and m7.meta_key = 'first_name_father_8')
join wp_usermeta m8 on (m7.user_id = m8.user_id and m8.meta_key = 'adress_father')
join wp_usermeta m9 on (m8.user_id = m9.user_id and m9.meta_key = 'phone_mother_16')
join wp_usermeta m10 on (m9.user_id = m10.user_id and m10.meta_key = 'mail_father')
join wp_usermeta m11 on (m10.user_id = m11.user_id and m11.meta_key = 'childs')
join wp_usermeta m12 on (m11.user_id = m12.user_id and m12.meta_key = 'birth_data')
join wp_usermeta m13 on (m12.user_id = m12.user_id and m13.meta_key = 'leben_vorname')
join wp_usermeta m14 on (m13.user_id = m13.user_id and m14.meta_key = 'leben_nachname')
join wp_usermeta m15 on (m14.user_id = m14.user_id and m15.meta_key = 'leben_adress')
join wp_usermeta m16 on (m15.user_id = m15.user_id and m16.meta_key = 'leben_phone')
join wp_usermeta m17 on (m16.user_id = m16.user_id and m17.meta_key = 'leben_mail')
join wp_usermeta m18 on (m17.user_id = m17.user_id and m18.meta_key = 'ak')
where m1.meta_key = 'firstnamemother'
什么对我有用:
SELECT user_id,
CASE WHEN meta_key LIKE '%mother' THEN 'mother'
WHEN meta_key LIKE '%father' THEN 'father'
WHEN meta_key LIKE '%8' THEN 'father'
END AS AorB,
MAX(CASE WHEN meta_key='firstnamemother'
OR meta_key='first_name_father'
THEN meta_value END) AS Vorname,
MAX(CASE WHEN meta_key='nachnamemother'
OR meta_key='first_name_father_8'
THEN meta_value END) AS Nachname,
MAX(CASE WHEN meta_key='adress_mother'
OR meta_key='adress_father'
THEN meta_value END) AS Adresse
FROM wp_usermeta
GROUP BY
user_id,
CASE WHEN meta_key LIKE '%mother' THEN 'mother'
WHEN meta_key LIKE '%father' THEN 'father'
WHEN meta_key LIKE '%8' THEN 'father'
END
【问题讨论】:
标签: sql wordpress split pivot-table