2012-04-07 58 views
0

我有这2个表:MySQL的加入与第二个表上相同的日期多次往返两个表

table1: 
--------- 

UserID:  Date:  Day_status: 
----------------------------------- 
3004  2010-01-01  Normal 
3004  2010-01-12  Normal 
3004  2010-01-15  Ignore 
3004  2010-01-18  Abnormal 
4001  2010-01-09  Normal 
4001  2010-01-11  Ignore 
4001  2010-02-10  Normal 
4001  2010-02-12  Abnormal 
------------------------------------ 

table:2 
------- 
UserID:  Date:  Time   Height 
-------------------------------------------- 
3004  2010-01-01  08:01:02  35 
3004  2010-01-01  09:01:12  32 
3004  2010-01-01  18:01:02  40 

3004  2010-01-02  07:01:02  20 
3004  2010-01-02  08:01:02  30 
3004  2010-01-02  10:01:02  10 

3004  2010-01-08  07:01:02  20 
3004  2010-01-08  08:01:02  30 
3004  2010-01-08  10:01:02  10 

3004  2010-01-12  07:01:02  30 
3004  2010-01-12  09:01:02  50 
3004  2010-01-12  18:01:02  30 

3004  2010-01-15  07:01:02  30 
3004  2010-01-15  09:01:02  50 
3004  2010-01-15  18:01:02  30 

3004  2010-01-18  07:01:02  30 
3004  2010-01-18  09:01:02  50 
3004  2010-01-18  18:01:02  30 

4001  2010-01-08  07:01:02  30 
4001  2010-01-08  08:01:02  30 
4001  2010-01-08  09:01:02  40 
4001  2010-01-08  13:01:02  30 

4001  2010-01-09  07:01:02  30 
4001  2010-01-09  08:01:02  30 
4001  2010-01-09  09:01:02  40 

4001  2010-01-11  08:01:02  30 
4001  2010-01-11  09:01:02  30 
4001  2010-01-11  18:01:02  30 

4001  2010-01-12  08:01:02  30 
4001  2010-01-12  09:01:02  30 
4001  2010-01-12  18:01:02  30 

4001  2010-01-13  08:01:02  30 
4001  2010-01-13  09:01:02  30 
4001  2010-01-13  18:01:02  30 

4001  2010-02-12  08:01:02  30 
4001  2010-02-12  09:01:02  30 
4001  2010-02-12  09:01:02  30 
----------------------------------------------- 

请记住,在表1:用户可以有多个“日期的(用户3004有多个日期)。并且,在表2中,

用户可以具有多个“日期”并且每个日期可以具有多个“时间”。在表2中,用户3004具有3个不同的'日期'2011-01-01'的时间等等。

我想,这样,

1)所有从表2,只有从表1的数据Day_status数据包括在结果中加入这两个表。

2)如果没有“Day_status”为表2中表1日起,在结果日期Day_status将显示为“正常”(注:表2比表1更日期输入)

3)Day_status条目=“忽略”从表1也不会在最终结果

输出将是这样的:

UserID:  Date:  Time   Height  Day_status_val 
--------------------------------------------------------------- 
3004  2010-01-01  08:01:02  35  Normal 
3004  2010-01-01  09:01:12  32  Normal 
3004  2010-01-01  18:01:02  40  Normal 

3004  2010-01-02  07:01:02  20  Normal 
3004  2010-01-02  08:01:02  30  Normal 
3004  2010-01-02  10:01:02  10  Normal 

3004  2010-01-08  07:01:02  20  Normal 
3004  2010-01-08  08:01:02  30  Normal 
3004  2010-01-08  10:01:02  10  Normal 

3004  2010-01-12  07:01:02  30  Normal 
3004  2010-01-12  09:01:02  50  Normal 
3004  2010-01-12  18:01:02  30  Normal 

3004  2010-01-18  07:01:02  30  Abnormal 
3004  2010-01-18  09:01:02  50  Abnormal 
3004  2010-01-18  18:01:02  30  Abnormal 

4001  2010-01-08  07:01:02  30  Normal 
4001  2010-01-08  08:01:02  30  Normal 
4001  2010-01-08  09:01:02  40  Normal 
4001  2010-01-08  13:01:02  30  Normal 

4001  2010-01-09  07:01:02  30  Normal 
4001  2010-01-09  08:01:02  30  Normal 
4001  2010-01-09  09:01:02  40  Normal 

4001  2010-01-12  08:01:02  30  Normal 
4001  2010-01-12  09:01:02  30  Normal 
4001  2010-01-12  18:01:02  30  Normal 

4001  2010-01-13  08:01:02  30  Normal 
4001  2010-01-13  09:01:02  30  Normal 
4001  2010-01-13  18:01:02  30  Normal 

4001  2010-02-12  08:01:02  30  Abnormal 
4001  2010-02-12  09:01:02  30  Abnormal 
4001  2010-02-12  09:01:02  30  Abnormal 
----------------------------------------------- 

我用下面的查询得到我的结果:

SELECT table2.UserID, table2.Date, table2.Time, table2.Height, 

CASE 
    when table1.Day_status='Abnormal Day' then 'Abnormal Day' 
    when table1.Day_status='Normal Day' then 'Normal Day' 
    else 'Normal Day' 
END as Day_status_val 

FROM table2 LEFT JOIN table1 
ON table2.UserID = table1.UserID and table1.Day_status !='Ignore' 

但是,它给出了错误的结果。任何人都可以请帮我解决这个问题。请查看表1和表2中的数据以及我所需的输出。

回答

0

我想你快到了。您需要添加一个额外的ON子句以匹配日期字段,并且您可以使用IFNULL来获取正确的Day_status。

SELECT t2.UserID,t2.Date,t2.Time,t2.Height,IFNULL(t1.Day_status,'Normal') 
FROM table2 t2 
    LEFT JOIN table1 t1 
    ON t2.UserID = t1.UserID 
    AND t1.Day_status !='Ignore' 
    AND t2.`Date`=t1.`Date` 
+0

对不起,延迟回复。非常感谢您的帮助。我会试试看。 – Tariq 2012-04-10 22:57:29