【问题标题】:Sort by value based on another column value根据另一列值按值排序
【发布时间】:2018-09-27 17:45:55
【问题描述】:

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

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_meta 表

╔════=====╦══════════════==╦══════=======╗
║ 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 BY um.user_id 正在滥用 MySQL 的 GROUP BY 功能,这将导致无效结果。 psce.com/en/blog/2012/05/15/… ...此外,您正在使用难以阅读和维护的逗号连接语法以及超过 25 年的非常古老的语法。请改用普通的JOIN ... ON ... 语法。
  • 是的,我意识到这是较旧的语法。我使用的是 GROUP BY,所以我可以将名字和姓氏组合在同一行。我添加了示例数据和预期结果。

标签: mysql sql wordpress


【解决方案1】:

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

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

查看SQLFiddle 以了解它的实际应用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2018-01-01
    相关资源
    最近更新 更多