1

次のツリーテーブルがあります

テーブルソルジャー

ID | 名前
---------------
22 | フランク
23 | ポール
24 | 明細書

表 Soldior_status_history

兵士_id | date_record | 兵士_ステータス
-------------------------------------------------- ---------------          
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

テーブルの兵士_値

ID | 鍵
----------------
37 | 義務
38 | 利用可能
40 | 休暇
41 | 病気

それらに参加し、特定の兵士の最後のdate_recordのsoldier_statusが「休暇」または「病気」ではないテーブルsoldier_status_historyからのレコードのみを返す選択を行うことは可能ですか?</p>

つまり、「ポール」という名前の人物にはツリー レコードがありますが、最後のレコードは彼が病気であるというレコードであり、ステータスが変更されない限り、この人物は表示されません。

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 * 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 に答える
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 に答える