1

我有以下树表

表兵

身份证 | 姓名
---------------
22 | 弗兰克
23 | 保罗
24 | 账单

表士兵状态历史

士兵ID | 日期记录 | 士兵身份
-------------------------------------------------- ---------------          
22 | 2012-12-07 18:09:58 | 37
22 | 2012-12-08 18:10:11 | 38
22 | 2012-12-10 18:20:25 | 41
23 | 2011-08-17 23:59:10 | 37
23 | 2011-08-19 23:59:11 | 38
23 | 2011-08-22 00:00:00 | 41  
23 | 2011-08-25 12:00:22 | 38   
24 | 2011-08-24 19:18:43 | 37  
24 | 2011-08-29 19:18:44 | 38

表士兵值

编号 | 钥匙
----------------
37 | 值班
38 | 可用的
40 | 假期
41 | 患病的

是否可以进行选择以加入他们并仅返回我从表士兵状态历史记录中的记录,即特定士兵的最后一个日期记录的士兵状态不是“假期”或“生病”</p>

我的意思是,对于这个名为“Paul”的人,我们有树记录,但最后一个记录是他生病了,因此在其状态未更改之前不应显示此人。

23 | 2011-08-17 23:59:10 | 37
23 | 2011-08-19 23:59:11 | 38
23 | 2011-08-22 00:00:00 | 41
4

2 回答 2

0

尝试这个:

SELECT
  h.*
FROM Soldier s 
INNER JOIN soldier_status_history h ON s.ID = h.soldier_id
INNER JOIN
(
  SELECT Soldier_id, MAX(date_record) latestDate
  FROM soldier_status_history 
  GROUP BY soldier_id
) l  ON h.soldier_id = s.ID
    AND DATE(l.latestDate) = DATE(h.date_record);

SQL 小提琴演示

这会给你:

| SOLDIER_ID |                     DATE_RECORD | SOLDIER_STATUS |
-----------------------------------------------------------------
|         22 | December, 10 2012 18:20:25+0000 |             41 |
|         23 |   August, 25 2011 12:00:22+0000 |             38 |
|         24 |   August, 29 2011 19:18:44+0000 |             38 |
于 2013-01-11T07:42:59.763 回答
0
select * from 
soldier s
left join 
(select 
     soldier_id, 
     max(date_record) maxDate_record
   from soldier_status_history 
   group by soldier_id
) s2 
    on (s.id=s2.soldier_id)
left join soldier_status_history s3 
    on (s2.soldier_id=s3.soldier_id) and (s2.maxDate_record=s3.date_record)

where s3.soldier_status not in (40,41)
于 2013-01-11T07:38:28.507 回答