用mySql命令获取元信息?

时间:2011-07-06 20:20:08

标签: php mysql sql

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

4 个答案:

答案 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