在附加列

时间:2017-12-03 16:26:53

标签: mysql sql mysql-workbench

  

在一个示例项目中,我想以这样一种方式显示数据:基于日期,同一学生的记录会附加在其他列中。

mysql> desc sch_student;

+----------------+--------------+
| Field          | Type         |
+----------------+--------------+
| s_first_name   | varchar(128) |
| s_last_name    | varchar(128) |
| rollcode       | int(8)       |
| regnum         | int(8)       |
| in_time        | datetime     |
| out_time       | datetime     |
| total_time     | int(8)       |
+----------------+--------------+
  

对于下面的查询我得到如下的样本输出,我的预期输出是我无法得到的。我尝试了Sample join但它没有用。

mysql> select * from sch_student;
    +-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+
| s_first_name      | s_last_name   | rollcode     | regnum    | in_time             | out_time            | total_time     |
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+
| Suzan             | Matsuo        | 8900         | 2897      | 2017-12-02 22:30:11 | 2017-12-02 22:30:11 | 00:17:00       |
| Scottie           | Ogletree      | 5624         | 5627      | 2017-12-02 16:40:01 | 2017-12-02 16:40:05 | 00:26:04       |
| Cynthia           | Zimmerman     | 3107         | 6348      | 2017-12-02 16:35:01 | 2017-12-02 16:35:01 | 00:59:89       |
| Ricardo           | Shurtliff     | 3072         | 261       | 2017-12-02 15:33:01 | 2017-12-02 15:33:01 | 00:16:55       |
| Elizabeth         | Milligan      | 4722         | 3233      | 2017-12-02 15:06:00 | 2017-12-02 15:10:33 | 00:14:33       |
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+

预期输出如下所示

+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+--------------+-----------+---------------------+---------------------+----------------+
| s_first_name      | s_last_name   |                         Today's Meeting                                               |                         Day Before Yesterday's Meeting                                |
|                                   | rollcode     | regnum    | in_time             | out_time            | total_time     | rollcode     | regnum    | in_time             | out_time            | total_time     |
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+--------------+-----------+---------------------+---------------------+----------------+
| Suzan             | Matsuo        | 8900         | 2897      | 2017-12-02 22:30:11 | 2017-12-02 22:30:11 | 00:17:00       | 8900         | 2897      | 2017-11-30 12:30:11 | 2017-11-30 12:50:11 | 00:17:00       |
| Scottie           | Ogletree      | 5624         | 5627      | 2017-12-02 16:40:01 | 2017-12-02 16:40:05 | 00:26:04       | 5624         | 5627      | 2017-11-30 18:40:01 | 2017-11-30 19:33:05 | 00:26:04       |
| Cynthia           | Zimmerman     | 3107         | 6348      | 2017-12-02 16:35:01 | 2017-12-02 16:35:01 | 00:59:89       | 3107         | 6348      | 2017-11-30 13:35:01 | 2017-11-30 14:15:01 | 00:59:89       |
| Ricardo           | Shurtliff     | 3072         | 261       | 2017-12-02 15:33:01 | 2017-12-02 15:33:01 | 00:16:55       | 3072         | 261       | 2017-11-30 19:33:01 | 2017-11-30 20:33:01 | 00:16:55       |
| Elizabeth         | Milligan      | 4722         | 3233      | 2017-12-02 15:06:00 | 2017-12-02 15:10:33 | 00:14:33       | 4722         | 3233      | 2017-11-30 18:06:00 | 2017-11-30 19:10:33 | 00:14:33       |
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+--------------+-----------+---------------------+---------------------+----------------+
  

我尝试了下面的连接,它没有返回预期的输出。是否可以从表中显示条件列?

    select * from 
(
    (select s_first_name,s_last_name,rollcode,regnum,in_time from sch_student where sch_student.in_time BETWEEN CURDATE()- INTERVAL 1 DAY AND CURDATE() ) As TD,    
    (select s_first_name,s_last_name,rollcode,regnum,in_time from sch_student where sch_student.in_time BETWEEN CURDATE()- INTERVAL 3 DAY AND CURDATE() ) As DBYS
) ;

2 个答案:

答案 0 :(得分:0)

如果您想获取今天会议和“昨天之前”会议的信息,请尝试使用LEFT JOIN:

SELECT s_first_name, s_last_name, rollcode, regnum, in_time 
FROM sch_student AS sch_today
LEFT JOIN sch_student AS sch_daybeforeyesterday ON 
  sch_today.<PK_FIELD> = sch_daybeforeyesterday.<PK_FIELD> AND 
  sch_daybeforeyesterday.in_time BETWEEN CURDATE()- INTERVAL 3 DAY AND CURDATE() - INTERVAL 2 DAY
WHERE sch_student.in_time BETWEEN CURDATE()- INTERVAL 1 DAY AND CURDATE()

这将在过去0-24小时内为您提供所有“in_time”行。对于这些行中的每一行,它将在48-72小时内返回具有“in_time”的任何相应行。

答案 1 :(得分:0)

我认为这就是你所需要的。我还没有测试过它。基本上,查询获取今天的数据LEFT加入前天的数据。我假设regnum和rollcode成为你的主键。如果不是这样的话就改变。

SELECT TD.* , DBYS.*
FROM (
    SELECT s_first_name
        ,s_last_name
        ,rollcode
        ,regnum
        ,in_time
    FROM sch_student
    WHERE sch_student.in_time BETWEEN CURDATE() - INTERVAL 1 DAY
            AND CURDATE()) AS TD
LEFT JOIN (
    SELECT s_first_name
        ,s_last_name
        ,rollcode
        ,regnum
        ,in_time
    FROM sch_student
    WHERE sch_student.in_time BETWEEN CURDATE() - INTERVAL 3 DAY
            AND CURDATE() - INTERVAL 2 DAY) AS DBYS 
ON (TD.regnum = DBYS.regnum AND 
    TD.rollcode = DBYS.rollcode);
相关问题