使用自定义表

时间:2016-05-06 16:02:17

标签: mysql sql

这是我的查询。我正在尝试使用已定义的表加入表。但问题是,当我们尝试左连接时,它会像内连接一样受到影响。

SELECT A.*,B.*,
 (CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat 
 FROM (
   SELECT '2016-05-04' AS preday 
   UNION 
   SELECT '2016-05-03' 
   UNION 
   SELECT '2016-05-02'
 ) AS A 
 LEFT JOIN `student_attendence` AS B ON B.date = A.preday 
 WHERE student_id='1' ;

例如,在我的右表中,不包含值为' 2016-05-02'的日期字段。 ,但是当我们尝试左连接时,它应该带有NULL值..但它不会来。

我的右连接表结构是 enter image description here

请帮我解决。

2 个答案:

答案 0 :(得分:1)

想一想这一秒。 Student_ID仅存在于student_Attendence表中(对于这两个表而言)。学生可能没有特定日期的记录(如果您未在结果中获得02,则必须如此;至少对于学生1而言)如果您希望从派生联盟表中获得所有日期;然后你需要在加入之前过滤students_ID,这样学生1记录的不匹配日就会从左连接中保留

SELECT A.*,B.*, (CASE WHEN A.preday != '' THEN 'A' ELSE 'P' END) AS PreStat 
FROM (SELECT '2016-05-04' AS preday 
      UNION SELECT '2016-05-03' 
      UNION SELECT '2016-05-02') AS A 
LEFT JOIN `student_attendence` AS B 
  ON B.date = A.preday 
  and student_id='1' ;

Student_ID 1的Student_Attendance将是......

ID Date
1  2016-05-05
1  2016-05-04
1  2016-05-03
1  2016-05-01

所以左连接会导致......

Preday            ID Date                   
2016-05-04         1  2016-05-04
2016-05-03         1  2016-05-03
2016-05-02         

当你申请where子句时...自2016-05-02以来没有学生1的参赛作品,它就会被淘汰..

Preday            ID Date                   
2016-05-04         1  2016-05-04
2016-05-03         1  2016-05-03

但是如果你将where子句移动到连接...你可以在连接之前应用过滤器,从而保留02日期。

Preday            ID Date                   
2016-05-04         1  2016-05-04
2016-05-03         1  2016-05-03
2016-05-02         

答案 1 :(得分:0)

原因是因为查询的逻辑查询处理作为要执行的第一个子句是from子句然后在>分组>有>选择>

订购

因此,当您执行自己的查询时,要执行的第一个子句是从中返回的' 2016-05-02'与左连接一样为null 但是后面的where子句过滤结果集并删除它,因为null是未知的(它不是一个值,它代表缺失值)

所以你可以用where和operator替换where子句。