如何在同一选择查询中将一个表中的值交换到另一表中的值?

时间:2018-07-31 08:15:19

标签: mysql

我的数据库由两个表组成

用户

+---------+----------+---------------+-----------+
| user_id | username | password_hash | user_type |
+---------+----------+---------------+-----------+
| 1       | Admin    | hash          | 0         |
| 2       | Student  | hash          | 1         |
| 3       | Teacher  | hash          | 2         |
+---------+----------+---------------+-----------+

门票

+-----------+---------+-----------------+----------------+--------------------+---------------+-------------+
| ticket_id | user_id | ticket_category | ticket_summary | ticket_description | ticket_status | assignee_id |
+-----------+---------+-----------------+----------------+--------------------+---------------+-------------+
| 1         | 2       | Network         | Test Network   | Lorem Ipsum        | 1             | 1           |
| 2         | 3       | Printer         | Test Printer   | Lorem Ipsum        | 1             |             |
+-----------+---------+-----------------+----------------+--------------------+---------------+-------------+

tickets.user_id和tickets.assignee_id都是users.user_id的外键

我正在使用以下select语句查询这些表

SELECT username AS `Opened By`, assignee_id AS `Assigned To`, ticket_category AS `Category`, ticket_summary AS `Summary`, ticket_description AS `Description`, IF(ticket_status = 1,'Open','Closed') AS `Status` FROM tickets INNER JOIN users ON tickets.user_id = users.user_id;

这样会建立一个数据集

+-----------+-------------+----------+--------------+-------------+--------+
| Opened By | Assigned To | Category | Summary      | Description | Status |
+-----------+-------------+----------+--------------+-------------+--------+
| Student   | 1           | Network  | Test Network | Lorem Ipsum | Open   |
| Teacher   |             | Printer  | Test Printer | Lorem Ipsum | Open   |
+-----------+-------------+----------+--------------+-------------+--------+

在我的select语句中,我想用在用户表中也对应的用户名替换assignee_id号。

例如,第一张票证(ticket_id = 1)的被分配人ID为1,我希望“分配给”列显示用户名“ Admin”而不是1

如何修改选择查询以完成此操作?

2 个答案:

答案 0 :(得分:1)

只需再次加入assignee_id的users表即可。请注意,如果没有人分配给故障单,它必须是LEFT JOIN。您可能还希望在COALESCE上使用u2.username输出空白而不是(null)(即COALESCE(u2.username, ''))。 SQLFiddle

SELECT u1.username AS `Opened By`, 
       u2.username AS `Assigned To`, 
       ticket_category AS `Category`, 
       ticket_summary AS `Summary`, 
       ticket_description AS `Description`, 
       IF(ticket_status = 1,'Open','Closed') AS `Status` 
FROM tickets 
JOIN users u1 ON tickets.user_id = u1.user_id
LEFT JOIN users u2 ON tickets.assignee_id = u2.user_id

输出示例数据:

Opened By   Assigned To   Category   Summary       Description   Status
Student     Admin         Network    Test Network  Lorem Ipsum   Open 
Teacher     (null)        Printer    Test Printer  Lorem Ipsum   Open 

答案 1 :(得分:0)

select T.OpenedBy,u.username as AssignedTo,Category,Summary,Description,Status from 
(
 SELECT username AS `OpenedBy`, assignee_id , ticket_category AS `Category`, ticket_summary AS `Summary`, ticket_description AS `Description`, IF(ticket_status = 1,'Open','Closed') AS `Status` FROM tickets INNER JOIN users ON tickets.user_id = users.user_id
) as T

inner join
users u on T.assignee_id=u.user_id