首页 > 解决方案 > php mysql在记录之间按月选择

问题描述

我有这个 MySQL 表 my_table:

+-------+------------+-----------+
|Student|    Date    | Classroom |
+-------+------------+-----------+
|     1 | 2018-01-01 |       101 |
|     2 | 2018-01-01 |       102 |
|     3 | 2018-01-01 |       103 |
|     1 | 2018-03-01 |       104 |
|     2 | 2018-06-01 |       103 |
|     3 | 2018-09-01 |       104 |
|     1 | 2018-11-01 |       106 |
|     2 | 2018-12-01 |       101 |
+-------+------------+-----------+

学生们待在指定的教室里,直到换完为止。

我想知道他们在哪个教室呆了一个月。

例如在 10 月(10 日),学生 1 在 104 中,2 在 103 中,3 在 104 中。

我真的不确定如何继续进行此操作,因此不胜感激。

当前使用基于草莓答案的此查询

SELECT x.* 
FROM my_table x 
LEFT OUTER JOIN my_table y 
ON y.student = x.student
AND y.date < x.date
WHERE x.date <= LAST_DAY('2018-10-01')
GROUP BY student

标签: phpmysql

解决方案


DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(Student INT NOT NULL, Date DATE NOT NULL, Classroom INT NOT NULL,PRIMARY KEY(student,classroom));

INSERT INTO my_table VALUES
(1,'2018-01-01',101),
(2,'2018-01-01',102),
(3,'2018-01-01',103),
(1,'2018-03-01',104),
(2,'2018-06-01',103),
(3,'2018-09-01',104),
(1,'2018-11-01',106),
(2,'2018-12-01',101);

SELECT x.* 
  FROM my_table x 
  JOIN 
     ( SELECT student
            , MAX(date) date 
         FROM my_table 
        WHERE date <= LAST_DAY('2018-10-01') 
        GROUP 
           BY student
     ) y 
    ON y.student = x.student 
   AND y.date = x.date;

+---------+------------+-----------+
| Student | Date       | Classroom |
+---------+------------+-----------+
|       1 | 2018-03-01 |       104 |
|       2 | 2018-06-01 |       103 |
|       3 | 2018-09-01 |       104 |
+---------+------------+-----------+

推荐阅读