【问题标题】:MySQL - assigne new names in SELECT statement and order by that new namesMySQL - 在 SELECT 语句中分配新名称并按新名称排序
【发布时间】:2020-11-13 18:21:05
【问题描述】:

我有一个具有基本结构的表:

id | first_name | last_name | role_id 

role_id 是 int 类型,用户可以添加新角色。我需要按角色名称排序,而不是按角色 ID,但我想避免加入。有没有办法制作 SELECT 语句 我可以做这样的事情:

 SELECT users.*, (
    if(role_id = 1, roleName), 
    if(role_id = 2, roleName2),
    if(role_id = 3, roleName3))
    AS roleName )
ORDER BY roleName DESC

【问题讨论】:

  • 所以你有一个类似roles 的表,其中存储了角色并通过外键引用它们以及按角色名称对它们进行排序(存储在roles 表中)而无需实际访问roles 表?
  • @Progman 就是这种情况 - 尽可能避免加入。
  • 为什么要避免使用JOIN?如果你想避免JOIN,角色名称应该从哪里来?
  • 我正在缓存角色(因为它们不经常添加),所以我将它们放在后端。
  • 只需加入即可。或者在缓存了角色名称的客户端中排序。

标签: mysql


【解决方案1】:

使用CASE 表达式:

 SELECT *, 
    CASE role_id
      WHEN 1 THEN 'roleName1'
      WHEN 2 THEN 'roleName2'
      WHEN 3 THEN 'roleName3'
    END AS roleName
FROM users
ORDER BY roleName DESC

或者,如果role_ids 是从 1 到 n 的整数,则使用 ELT() 函数:

SELECT *, ELT(role_id, 'roleName1', 'roleName2', 'roleName3') AS roleName
FROM users
ORDER BY roleName DESC

【讨论】:

  • 感谢您的帮助:)
猜你喜欢
  • 2018-04-03
  • 2020-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多