【问题标题】:How can I swap a value from one table to that of another table in the same select query?如何在同一个选择查询中将一个表的值交换到另一个表的值?
【发布时间】:2018-07-31 08:15:19
【问题描述】:

我的数据库由两个表组成

用户

+---------+----------+---------------+-----------+
| 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 编号替换为它在 users 表中也对应的用户名。

例如,第一张工单 (ticket_id = 1) 的 assignee_id 为 1,我希望“分配给”列显示用户名“Admin”而不是 1

如何修改我的选择查询来完成此操作?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    只需为assignee_id 再次加入用户表。请注意,它必须是LEFT JOIN,以防没有人分配给票证。您可能还想在u2.username 上使用COALESCE 来输出空白而不是(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 
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 2019-04-12
        • 1970-01-01
        • 1970-01-01
        • 2019-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-04
        相关资源
        最近更新 更多