Mysql 基于另一列值按值排序

Mysql 基于另一列值按值排序,mysql,sql,wordpress,Mysql,Sql,Wordpress,这是来自Wordpress的查询,但适用于以这种方式设置的任何数据库。它们在元字段中存储了一些数据。有一个表有两个字段,分别称为meta_name和meta_value。这些字段用于存储几乎所有内容。例如,meta_name可以是“lastname”,meta_value是该名称的值。我有一个将返回所有用户的查询,但当meta_name=“lastname”时,如何按meta_值排序?下面是当前的查询 SELECT um.user_id, users.display_name, GROUP_CO

这是来自Wordpress的查询,但适用于以这种方式设置的任何数据库。它们在元字段中存储了一些数据。有一个表有两个字段,分别称为meta_name和meta_value。这些字段用于存储几乎所有内容。例如,meta_name可以是“lastname”,meta_value是该名称的值。我有一个将返回所有用户的查询,但当meta_name=“lastname”时,如何按meta_值排序?下面是当前的查询

SELECT um.user_id, users.display_name, GROUP_CONCAT(um.meta_value SEPARATOR ' ') 
FROM `wp_7bv88z_usermeta` um, `wp_7bv88z_pmpro_memberships_users` u, `wp_7bv88z_users` users 
WHERE u.user_id=um.user_id and users.ID=u.user_id and (um.meta_key='pmpro_sfirstname' or um.meta_key='pmpro_slastname') 
and u.status='active'
GROUP BY um.user_id
样本数据:

用户元表

╔════=====╦══════════════==╦══════=======╗
║ user_id ║  meta_key        ║ meta_value  ║
╠════=====╬══════════════==╬══════=======╣
║  1      ║ pmpro_sfirstname ║ Jeff        ║
║  1      ║ pmpro_slasttname ║ Atwood      ║
║  2      ║ pmpro_sfirstname ║ Geoff       ║
║  2      ║ pmpro_slasttname ║ Davis       ║
║  3      ║ pmpro_sfirstname ║ Jarrod      ║
║  3      ║ pmpro_slasttname ║ Minor       ║
║  4      ║ pmpro_sfirstname ║ Joel        ║
║  4      ║ pmpro_slasttname ║ Brown       ║
╚════=====╩════════════=====╩══════======╝
预期成果:

1, Jeff Atwood
4, Joel Brown
2, Geoff Davis
3, Jarrod Minor

我不喜欢旧语法或交叉连接,但你可以这样做

SELECT um.user_id, 
       users.display_name, 
       GROUP_CONCAT(um.meta_value SEPARATOR ' ') 
FROM `user_meta` um, 
      `memberships_users` u, 
      `users` users,
      `user_meta` lname,
      `user_meta` fname
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 (um.meta_key='pmpro_sfirstname' or um.meta_key='pmpro_slastname') 
and   u.status='active'
GROUP BY lname.meta_value, fname.meta_value, um.user_id

看看这个,看看它的实际应用

我不喜欢旧语法或交叉连接,但你可以这样做

SELECT um.user_id, 
       users.display_name, 
       GROUP_CONCAT(um.meta_value SEPARATOR ' ') 
FROM `user_meta` um, 
      `memberships_users` u, 
      `users` users,
      `user_meta` lname,
      `user_meta` fname
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 (um.meta_key='pmpro_sfirstname' or um.meta_key='pmpro_slastname') 
and   u.status='active'
GROUP BY lname.meta_value, fname.meta_value, um.user_id

查看此项以查看其运行情况

显示示例数据和预期结果。
选择um.user\u id,users.display\u name。。。。GROUP BY um.user_id
正在误用MySQL的GROUP BY功能,这将导致无效结果。。。此外,您使用的逗号连接语法很难阅读和维护,而且非常旧的语法已经超过25年了。使用普通
连接。。。改为使用…
syntax。是的,我知道这是较旧的语法。我使用了GROUPBY,这样我就可以在同一行上组合firstname和lastname。我已添加示例数据和预期结果。显示示例数据和预期结果。
选择um.user\u id,users.display\u name。。。。GROUP BY um.user_id
正在误用MySQL的GROUP BY功能,这将导致无效结果。。。此外,您使用的逗号连接语法很难阅读和维护,而且非常旧的语法已经超过25年了。使用普通
连接。。。改为使用…
syntax。是的,我知道这是较旧的语法。我使用了GROUPBY,这样我就可以在同一行上组合firstname和lastname。我添加了示例数据和预期结果。