2

staff_status構造とレコードで名前を付けた次のテーブルがあります。

----------------------------------------------------
| id (INT) | status (VARCHAR) | status_date (DATE) |
----------------------------------------------------
|   1      |     Working      |    2009-05-03      |
|   2      |     Working      |    2009-07-21      |
|   1      |     Leave        |    2010-02-01      |
|   1      |     Working      |    2010-02-15      |
----------------------------------------------------

statusこれをクエリして、特定の日付のスタッフを取得したいと思います。例: on のステータスが返され、onid = 1が返される必要があります2010-02-10Leave2010-03-01Working

私が成功せずに試したこと:

SELECT t1.status FROM staff_status t1 INNER JOIN (SELECT * FROM staff_status WHERE id = 1 AND status_date < '2010-02-10') t2 ON (t1.id = t2.id AND t1.status_date < t2.status_date);

4

5 に答える 5

2

次のようなものを試すことができます

SELECT  s.*
FROM    staff_status s INNER JOIN
        (
            SELECT  id,
                    MAX(status_date) status_date
            FROM    staff_status
            WHERE   status_date < '2010-02-10'
            AND     id = 1
        ) m ON  s.id = m.id
            AND s.status_date = m.status_date

さらに、ORDER BY status_date DESC LIMIT 1 を試すことができます

13.2.8から。SELECT 構文

何かのようなもの

SELECT  *
FROM    staff_status
WHERE   id = 1
AND     status_date < '2010-02-10'
ORDER BY    status_date DESC
LIMIT 1
于 2012-08-10T06:10:35.230 に答える
1

まず、ID ごとの日付の MAX() が必要です。

SELECT id, MAX(status_date)
FROM staff_status
WHERE status_date < "2010-02-10" GROUP BY id

...しかし、MySQL は、ステータスが行からのものであることを保証しませんMAX(status_date)(実際、これはほとんどの場合ではありません)。したがって、上記で見つけた情報を取得し、元のテーブルからこれらのレコードを引き出して、 と を照合する必要がidありstatus_dateます。

SELECT id, status
FROM staff_status
WHERE
    (id, status_date)
    IN
    (
        SELECT id, MAX(status_date)
        FROM staff_status
        WHERE status_date < "2010-02-10" GROUP BY id
    );

これは、より前に見つかった最新の日付idの とesのリストを生成します。status2010-02-10

+------+---------+
| id   | status  |
+------+---------+
|    2 | Working |
|    1 | Leave   |
+------+---------+
2 rows in set (0.01 sec)
于 2012-08-10T06:10:46.810 に答える
0

これを試して:

SELECT IFNULL((SELECT status 
               FROM staff_status 
               WHERE id = 1 AND
                     status_date = '2010-02-10'), 
               "Leave") AS status;
于 2012-08-10T06:11:15.170 に答える
0

確かに単純に:

SELECT status FROM staff_status WHERE status_date = '2010-02-10'

あなたを「去る」と返しますか?

于 2012-08-10T06:18:41.797 に答える
0

これを試して:

select status 
from staff_status 
where status_date<='2010-03-01'
and id=1
order by status_date desc 
limit 1
于 2012-08-10T06:08:32.867 に答える