在SQL中按名称替换2个ID

时间:2017-01-07 09:01:39

标签: mysql sql

我有两个表如下所示:

Table 1

Table 2

我想要做的是,我想用表2中的名字和姓氏替换表1中的change_builder ID。另外,我想对表2中的change_manager_ID做同样的事情(用它代替它)表2中的名字和姓氏

我的查询如下所示:

SELECT a.change_number, a.title, change_manager_id,change_builder_id, concat(users.first_name,' ', users.last_name) as Manager_Name, concat(users.first_name,' ', users.last_name) as Builder_Name,

(CASE 
WHEN a.change_state_id = '128' THEN 'In Progress'
WHEN a.change_state_id = '127' THEN 'Approved'
WHEN a.change_state_id = '125' THEN 'Pending'
WHEN a.change_state_id = '124' THEN 'Requested'

END) AS Change_State

FROM change_item as a
LEFT JOIN users
ON a.change_manager_id = users.id


WHERE a.change_state_id = 128
OR a.change_state_id = 124
OR a.change_state_id = 125
OR a.change_state_id = 127

这个输出正在更改管理员的名字和姓氏,但是我也希望为构建器做同样的事情。

我被卡住了,任何帮助或提示都会非常感激。

1 个答案:

答案 0 :(得分:0)

似乎你已经忘记了你可以将表连接两次到同一个其他表 - 每个连接描绘一个不同的关系。 良好实践要求您为每个连接子句指定一个良好的相关名称来描述关系的作用。

而且,请为正确的类型使用正确的文字。

不是change_state_id = '128'(字符串),而是change_state_id = 124(数字)。隐式转换很慢,可能会影响数据质量。

我使用了一个IN()子句而不是一堆OR-s:

SELECT 
   a.change_number
  ,a.title
  ,change_manager_id
  ,change_builder_id
  ,CONCAT (mgr.first_name,' ',mgr.last_name) AS Manager_Name
  ,CONCAT (bld.first_name,' ',bld.last_name) AS Builder_Name
  ,CASE 
     WHEN a.change_state_id = 128 THEN 'In Progress'
     WHEN a.change_state_id = 127 THEN 'Approved'
     WHEN a.change_state_id = 125 THEN 'Pending'
     WHEN a.change_state_id = 124 THEN 'Requested'
   END AS Change_State
FROM change_item AS a
LEFT JOIN users AS mgr -- join as manager
ON a.change_manager_id = mgr.id
LEFT JOIN users AS bld -- join as builder
ON a.change_builder_id = bld.id
WHERE a.change_state_id IN(128,124,125,127)
    ;