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
最佳答案
这是您要找的吗?仍然是 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;
关于php - 对mySql命令获取meta信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602443/