【发布时间】:2011-09-29 22:54:27
【问题描述】:
Wordpress 是一个很好的 Web 应用程序示例,它使用一个表来存储用户信息,然后使用元查找表来存储用户数据。唯一的问题是,我知道获取用户列表的完整元信息列表的唯一方法是“手动”构建 sql 语句 - 硬编码或在 PHP 的帮助下。
用户表如下所示:
wp_users 表
ID|user_login|user_email|user_pass|date_registered ==================================================== 1|我 |me@me1.com|f239j283r| 2011-01-01wp_usermeta 表
umeta_id|user_id|meta_key|meta_value ===================================== 1 | 1 |电话 | 123-4567 1 | 1 |名称 |约翰 1 | 1 |姓名 |母鹿我知道我可以做这样的事情(手动或使用 php)来实现我想要的结果:
选择 * 来自 wp_users 左加入 wp_usermeta 作为电话 (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|电话|fname|lname ==================================================== ================+++=== 1|我 |me@me1.com|f239j283r| 2011-01-01 |123-4567|约翰|能源部我知道 mySql 也有 GROUP_CONCAT 的东西,这就是为什么我觉得有更好的方法。看起来像这样:
选择 *, group_concat(meta_value) 作为 all_meta 来自 wp_users 在 ID = user_id 上左加入 wp_usermeta 按 wp_users.ID 分组那么有没有办法通过像第二个更动态的 sql 语句来获得类似于第一个 sql 语句的结果?
编辑
Doug 提出了一个有趣的解决方案,可能使用 information_schema。我无法让它工作,所以我为任何想要测试他们的 SQL 的人发布了两个表的转储:) http://pastebin.com/w0jkxnws
【问题讨论】:
-
我不清楚您的目标,基于所列答案的 cmets。 Andriy M 的解决方案是 elagent,但需要知道列名。正如您所建议的,使用 group_concat 可以动态获取所有信息。没有真正的方法可以动态翻转桌子(AFAIK),所以你已经列出了几乎所有的选项。
-
我在陈述我的目标时尽量简洁明了。归根结底,元查找表是包含用户列表(或其他项目)抽象信息的最具可扩展性的方式;然而,以表格格式为用户获取所有数据似乎需要很多步骤。在研究它之后我已经放弃了它,但我一直看到在 SO 上做事的非常聪明的方式(比如stackoverflow.com/questions/9122)所以我发布了这个问题,希望有一种比硬编码更动态的方式,或者使用PHP 和多个查询。也许没有
-
啊。引用的答案会起作用,但是从 information_schema 中提取每个查询确实会产生高昂的间接费用。我建议在代码中执行此操作,并缓存结果(这样您就不必一直重新执行此操作),但我很乐意给出这样的答案。
-
我不同意使用 information_schema 必然会产生“高昂的间接费用”——我们可以运行查询分析来找出答案。我欢迎使用 information_schema 来达到预期结果的答案。与已经发布的答案相比,这更像是我希望的方向(我已经知道这些方法)。谢谢道格!
-
这当然取决于你在做什么,任务有多复杂,你的模式有多复杂。计数很糟糕,但在我的大型数据库中,运行
select count(*) from information_schema.columns;需要 7.6 秒来处理 15,000 条记录。