2017-12-03 1 views
0

In einem Beispielprojekt wollte ich Daten so anzeigen, dass basierend auf Daten die Datensätze für denselben Studenten in zusätzlichen Spalten angezeigt werden.Anzeigen bedingter MySQL-Werte in zusätzlicher Spalte

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)  | 
+----------------+--------------+ 

für unter Abfrage i Beispielausgabe bin immer wie unten ist meine erwartete Ausgabe etwas, was ich nicht in der Lage bin zu bekommen. Ich habe versucht, Probe beizutreten, aber es hat nicht funktioniert.

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  | 
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+ 

Erwartete Ausgabe ist wie etwas unter

+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+--------------+-----------+---------------------+---------------------+----------------+ 
| 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  | 
+-------------------+---------------+--------------+-----------+---------------------+---------------------+----------------+--------------+-----------+---------------------+---------------------+----------------+ 

Ich habe versucht, unten kommen und es wird nicht ausgegeben erwartet zurück. Ist es möglich, eine bedingte Spalte aus der Tabelle anzuzeigen?

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 
) ; 

Antwort

0

Ich denke, das ist, was Sie brauchen. Ich habe es nicht getestet. Im Grunde erhält die Abfrage die heutigen Daten, die LEFT mit den Daten von vorgestern verbindet. Ich habe Regnum angenommen und Rollcode macht deinen Primärschlüssel. Ändern, wenn das nicht der Fall ist.

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); 
0

Wenn Sie Informationen für die heutige Sitzung erhalten möchten und die „Tag-vor-gestrigen“ Treffen versuchen, einen linken JOIN statt:

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() 

Dadurch erhalten Sie alle Zeilen mit "in_time" innerhalb der letzten 0-24 Stunden. Für jede dieser Zeilen werden innerhalb von 48-72 Stunden alle entsprechenden Zeilen mit "in_time" zurückgegeben.