mysql - 基于具有自连接的另一个列值按值排序

标签 mysql sql wordpress

我以前问过这个问题,但现在需要添加更多字段,并且由于自连接太多,相同的方法现在超时了。

这是我当前的查询。当我添加城市和州列时,它很慢,但性能足够,但当我添加邮政编码列时,它会超时。还有其他方法可以做到这一点吗?

SELECT um.user_id, 
       users.display_name, 
       GROUP_CONCAT(um.meta_value SEPARATOR ' '),
       city.meta_value,
       state.meta_value,
       zip.meta_value
FROM `wp_7bv88z_usermeta` um, 
     `wp_7bv88z_pmpro_memberships_users` u, 
     `wp_7bv88z_users` users,
     `wp_7bv88z_usermeta` lname,
     `wp_7bv88z_usermeta` fname,
     `wp_7bv88z_usermeta` city,
     `wp_7bv88z_usermeta` state,
     `wp_7bv88z_usermeta` zip
WHERE u.user_id = um.user_id 
     and users.id = u.user_id 
     and (lname.user_id = u.user_id and lname.meta_key = 'pmpro_slastname')
     and (fname.user_id = u.user_id and fname.meta_key = 'pmpro_sfirstname')
     and (city.user_id = u.user_id and city.meta_key = 'pmpro_scity')
     and (state.user_id = u.user_id and state.meta_key = 'pmpro_sstate')
     and (zip.user_id = u.user_id and zip.meta_key = 'pmpro_szipcode')
     and (um.meta_key='pmpro_sfirstname' or um.meta_key='pmpro_slastname') 
     and u.status='active'
GROUP BY lname.meta_value, fname.meta_value, city.meta_value, 
         state.meta_value, zip.meta_value, um.user_id

示例数据:

user_meta表

╔════=====╦══════════════==╦══════=======╗
║ user_id ║  meta_key        ║ meta_value  ║
╠════=====╬══════════════==╬══════=======╣
║  1      ║ pmpro_sfirstname ║ Jeff        ║
║  1      ║ pmpro_slasttname ║ Atwood      ║
║  1      ║ pmpro_scity      ║ Chicago     ║
║  1      ║ pmpro_sstate     ║ IL          ║
║  1      ║ pmpro_szip       ║ 60007       ║
║  2      ║ pmpro_sfirstname ║ Geoff       ║
║  2      ║ pmpro_slasttname ║ Davis       ║
║  2      ║ pmpro_scity      ║ Fairfax     ║
║  2      ║ pmpro_sstate     ║ VA          ║
║  2      ║ pmpro_szip       ║ 22030       ║
║  3      ║ pmpro_sfirstname ║ Jarrod      ║
║  3      ║ pmpro_slasttname ║ Minor       ║
║  3      ║ pmpro_scity      ║ Dallas      ║
║  3      ║ pmpro_sstate     ║ TX          ║
║  3      ║ pmpro_szip       ║ 75001       ║
║  4      ║ pmpro_sfirstname ║ Joel        ║
║  4      ║ pmpro_slasttname ║ Brown       ║
║  4      ║ pmpro_scity      ║ Boston      ║
║  4      ║ pmpro_sstate     ║ MA          ║
║  4      ║ pmpro_szip       ║ 02101       ║
╚════=====╩════════════=====╩══════======╝

预期结果:

1, Jeff Atwood, Chicago, IL, 60007
4, Joel Brown, Fairfax, VA, 22030
2, Geoff Davis, Dallas, TX, 75001
3, Jarrod Minor, Boston, MA, 02101

最佳答案

您可以使用聚合从 EAV 数据结构中选取值

select  user_id,
        max( case when meta_key = 'pmpro_sfirstname' then meta_value else null end) fname,
        max( case when meta_key = 'pmpro_slasttname' then meta_value else null end) lname,
        max( case when meta_key = 'pmpro_scity' then meta_value else null end) city,
        max( case when meta_key = 'pmpro_sstate' then meta_value else null end) state,
        max( case when meta_key = 'pmpro_szip' then meta_value else null end) zip
from user_meta
group by user_id

Demo

关于mysql - 基于具有自连接的另一个列值按值排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50873823/

相关文章:

具有 XML 命名空间的 SQL Server 2005 - 查询多个节点和属性

java - 字符串 -> java.util.Date -> java.sql.Date(带时间戳)

wordpress - 我的 CPT 分类法元字段未显示在 Wordpress REST API 中

MySQL 计数行包括零(非常接近我想要的!)

MySQL Workbench 查询首选项

mysql - 在 MySQL 中检索包含 3 个或更少字符的单词

php - 从 cookie 执行 PHP 代码

mysql - 带有Redis缓存和Mysql的Spring启动应用程序

sql - 操作数数据类型 float 对 '^' 运算符无效

html - H1 和网站内容从横幅中消失,就好像它们的上边距为负数一样