MYSQL状态的最大值

时间:2018-09-27 16:44:08

标签: mysql

我有下表记录了针对它们采取的字母与动作的详细信息。

字母表

+-----------+-------------+
| letter_id | description |
+-----------+-------------+
|         1 | A           |
|         2 | B           |
|         3 | C           |
|         4 | D           |
+-----------+-------------+

动作表

+-----------+--------+------------+---------------+
| action_id | ref_no |    date    | action_status |
+-----------+--------+------------+---------------+
|         1 |      1 | 2018-09-20 | On-Going      |
|         2 |      1 | 2018-09-22 | Finished      |
|         3 |      3 | 2018-09-16 | On-Going      |
|         4 |      4 | 2018-09-26 | On-Going      |
|         5 |      4 | 2018-09-27 | Finished      |
+-----------+--------+------------+---------------+

并需要获得以下输出

+-----------+-------------+------------+---------------+
| letter_id | description |    date    | action_status |
+-----------+-------------+------------+---------------+
|         1 | A           | 2018-09-22 | Finished      |
|         2 | B           | -          | Pending       |
|         3 | C           | 2018-09-16 | On-Going      |
|         4 | D           | 2018-09-27 | Finished      |
+-----------+-------------+------------+---------------+

我使用了以下查询

select letter.letter_id,letter.description, action.date, action.action_status
            from letter
           left join action on letter.letter_id=action.ref_no
            where (date in     
                    (          
                        select max(date) from action   
                            where letter.letter_id=action.ref_no 
                    ))

但是上面的查询会生成以下输出

+-----------+-------------+------------+---------------+
| letter_id | description |    date    | action_status |
+-----------+-------------+------------+---------------+
|         1 | A           | 2018-09-20 | On-Going      |
|         1 | A           | 2018-09-22 | Finished      |
|         2 | B           | -          | Pending       |
|         3 | C           | 2018-09-16 | On-Going      |
|         4 | D           | 2018-09-26 | On-Going      |
|         4 | D           | 2018-09-27 | Finished      |
+-----------+-------------+------------+---------------+

我不明白我要怎么做。谁能帮我吗?

1 个答案:

答案 0 :(得分:0)

DROP TABLE IF EXISTS action;

CREATE TABLE action
(action_id SERIAL PRIMARY KEY
,letter_id INT NOT NULL
,date DATE NOT NULL
,action_status VARCHAR(20) NOT NULL
);

INSERT INTO action VALUES
(1,101,'2018-09-20','On-Going'),
(2,101,'2018-09-22','Finished'),
(3,103,'2018-09-16','On-Going'),
(4,104,'2018-09-26','On-Going'),
(5,104,'2018-09-27','Finished');

SELECT x.* 
  FROM action x 
  JOIN 
     ( SELECT letter_id, MAX(date) max_date FROM action GROUP BY letter_id ) y 
    ON y.letter_id = x.letter_id 
   AND y.max_date = x.date;
+-----------+-----------+------------+---------------+
| action_id | letter_id | date       | action_status |
+-----------+-----------+------------+---------------+
|         2 |       101 | 2018-09-22 | Finished      |
|         3 |       103 | 2018-09-16 | On-Going      |
|         5 |       104 | 2018-09-27 | Finished      |
+-----------+-----------+------------+---------------+

想必您可以找出其余的