Wordpress是使用表格显示用户信息的Web应用程序的一个很好的示例,然后是用户数据的元查找表。唯一的问题是我知道获取用户列表的完整元信息列表的唯一方法是“手动”构建sql语句 - 硬编码或借助PHP。
用户表看起来像这样:
wp_users表
ID|user_login|user_email|user_pass|date_registered ================================================== 1| me |me@me1.com|f239j283r| 2011-01-01
wp_usermeta表
umeta_id|user_id|meta_key|meta_value ==================================== 1 | 1 | phone | 123-4567 1 | 1 | fname | john 1 | 1 | lname | doe
我知道我可以做这样的事情(手动或用php)来实现我想要的结果:
select * from wp_users left join wp_usermeta as phone on (ID = user_id) AND (meta_key = phone) left join wp_usermeta as fname on (ID = user_id) AND (meta_key = fname) left join wp_usermeta as lname on (ID = user_id) AND (meta_key = lname)
产生类似这样的东西:
ID|user_login|user_email|user_pass|date_registered|phone |fname|lname =================================================================+++=== 1| me |me@me1.com|f239j283r| 2011-01-01 |123-4567|john |doe
我知道mySql也有GROUP_CONCAT的东西,这就是为什么我觉得有更好的方法。这看起来像这样:
select *, group_concat(meta_value) as all_meta from wp_users left join wp_usermeta on ID = user_id group by wp_users.ID
那么有没有办法让结果与第一个sql语句的结果类似,并使用更像第二个的动态sql语句?
修改
Doug提出了一个有趣的解决方案,可能使用了information_schema。我无法让它工作,所以我已经为想要测试SQL的人发布了两个表的转储:) http://pastebin.com/w0jkxnws
答案 0 :(得分:1)
这是你要找的吗?这仍然是3个陈述,但是,与我之前的相反声明相反,准备费用应该不高。
set group_concat_max_len = 2048;
SELECT CONCAT('SELECT u.id, u.user_login, ', GROUP_CONCAT(concat('
(SELECT meta_value FROM wp_usermeta WHERE user_id = u.id AND meta_key = "', um.meta_key, '") `', um.meta_key, '`') SEPARATOR ", "), '
FROM wp_users u ') FROM (SELECT DISTINCT meta_key FROM wp_usermeta) um INTO @sql;
PREPARE stmt1 FROM @sql;
EXECUTE stmt1;
答案 1 :(得分:0)
通常这是通过对数据库运行2次查询来完成的 - 首先是获取用户记录,第二次是属性。
答案 2 :(得分:0)
试试这个
select *
from wp_users
left join wp_usermeta as fname on (ID = user_id)
where meta_key in ('fname','lname','phone')
group by ID, meta_key;
答案 3 :(得分:0)
您可以尝试这样的事情:
SELECT
u.*,
MIN(CASE m.meta_key WHEN 'phone' THEN m.meta_value END) AS phone,
MIN(CASE m.meta_key WHEN 'fname' THEN m.meta_value END) AS fname,
MIN(CASE m.meta_key WHEN 'lname' THEN m.meta_value END) AS lname
FROM wp_users u
LEFT JOIN wp_usermeta m ON u.ID = m.user_id
AND m.meta_key IN ('phone', 'fname', 'lname')
GROUP BY u.ID