複数の日付フィールドを持つテーブルがあり、どの列であるかに関係なく、現在の日付に最も近い日付を持つ行を選択したいと考えています。
データベースには 2 つのテーブルがあります。カバー:
create table covers (_id integer primary key autoincrement, "
+ "stallionName integer not null, mareName integer not null, firstCoverDate text not null, lastCoverDate text not null, "
+ "scan14Date text not null, scan28Date text not null, foalingDate text not null, inFoal integer not null, notes text not null," +
"FOREIGN KEY (stallionName) REFERENCES horses (_id), FOREIGN KEY (mareName) REFERENCES horses (_id))
StallionName と mareName は、horse テーブル内の関連する馬の行 _id を参照する整数です (そのため、SQL クエリには、row _id だけでなく、種馬と牝馬の名前を取得するための複数の結合があります)。すべての日付列は「YYYY-MM-DD」の形式です
そして馬:
create table horses (_id integer primary key autoincrement, "
+ "name text not null, type integer not null, birthDate text not null, vaccineDate text not null, "
+ "inFoal integer not null, notes text not null)
タイプは、スピナーの位置を参照する整数です (タイプは、牝馬、種牡馬、去勢馬などです)
今日の日付に最も近い scan14Date、scan28Date、および foalingDate の値を持つ、covers テーブルから 5 行を選択したい (つまり、5 つの最も緊急な行)
これが私のこれまでの取り組みです。
SELECT covers.* horses1.name AS stallionNameText, horses2.name AS mareNameText
FROM horses horses1 JOIN covers ON horses1._id = covers.stallionName JOIN horses horses2 ON horses2._id = covers.MareName
WHERE covers._id IN
(SELECT DISTINCT _id FROM
(SELECT covers.scan14Date AS date, covers._id
FROM covers
WHERE date > dateToday
UNION
SELECT covers.scan28Date AS date, covers._id
FROM covers
WHERE date > dateToday
UNION
SELECT covers.foalingDate AS date, covers._id
FROM covers
WHERE date > dateToday
ORDER BY date)
LIMIT 5)
('dateToday' も YYYY-MM-DD の形式であると想定できます。Java で整理されています)
ここで、以下のネストされたクエリは、5 つの「最も緊急な」行 _id を正常に選択します。
(SELECT DISTINCT _id FROM
(SELECT covers.scan14Date AS date, covers._id
FROM covers
WHERE date > dateToday
UNION
SELECT covers.scan28Date AS date, covers._id
FROM covers
WHERE date > dateToday
UNION
SELECT covers.foalingDate AS date, covers._id
FROM covers
WHERE date > dateToday
ORDER BY date)
LIMIT 5)
最初のセクションは、上で選択した行 _id のすべてのデータを正常に取得します。
SELECT covers.* horses1.name AS stallionNameText, horses2.name AS mareNameText
FROM horses horses1 JOIN covers ON horses1._id = covers.stallionName JOIN horses horses2 ON horses2._id = covers.MareName
WHERE covers._id IN
....
私が抱えている問題は、ネストされたクエリによって返される行 _ids の順序がクエリ全体で失われることです。たとえば、ネストされたクエリが行 _ids (6、3、4、12、15) を返す場合、全体的なクエリはそれを (3、4、6、12、15) の順序で表示します。
次に、種牡馬の名前、牝馬の名前、lastCoverDate、14ScanDate、28ScanDate、および foalingDate を返したいと思います。
私の質問は、内部クエリによって返された順序を維持するにはどうすればよいですか? 最後に単純に ORDER BY 日付を追加しようとしましたが、予想通り、そのような列はありません。
お読みいただきありがとうございます。
(また、私の SQL クエリが最も効率的な方法ではないことは確かですが、私はこれらすべてにかなり慣れていません)