1

最初にリマインダー日、次にIDでソートされたテーブルがあります

表は次のようになります。

ID | remind_date 
1     2011-01-23
2     2010-02-21
4     2011-04-04
5     2011-04-04
6     2009-05-04

PHPフロントエンドを使用して、レコードを前後に移動しています。進むボタンと戻るボタンが欲しいのですが、同じ 2 つのリマインダー日付で問題が発生しています。

ID が順番どおりではないことに注意してください。ID はここにありますが、実際のデータベースでは、reminder_date で並べ替えると混同されます。

私が使用している選択ステートメントは次のとおりです: ($iid は現在のレコードです)

SELECT id FROM myDB.reminders where remind_date > (SELECT remind_date FROM myDB.reminders where id=$iid)  order by remind_date ASC LIMIT 1

だから、reminder_date > を要求しているため、同じ日付に到達するとどうなりますか。

私がremind_date >=を使用すると、現在のレコードが返されます。私の解決策は、制限2を使用し、PHPを介して最初のレコードが現在のIDであるかどうかを確認し、次のレコードを使用したかどうかを確認することでした。しかし、同じ日付が3つある、または4つあるなど..

ID フィールドを使用することも考えましたが、順序が間違っているため、ID > $iid を追加できません。

何か案は?同じ2つの日付を除いて、うまく機能します。

4

3 に答える 3

1

あなたはこれを使うことができるかもしれません:

SELECT ID, remind_date
FROM
(
    SELECT @prev_id := -1
) AS vars
STRAIGHT_JOIN
(
    SELECT
        ID,
        remind_date,
        @prev_id AS prev_id,
        @prev_id := id
    FROM myDB.reminders
    ORDER BY remind_date, ID
) T1
WHERE prev_id = $iid

これがあなたのコメントからのあなたのテストデータによる上記のテストです:

CREATE TABLE Table1 (ID INT NOT NULL, remind_date DATE NOT NULL);
INSERT INTO Table1 (ID, remind_date) VALUES
(45, '2011-01-14'),
(23, '2011-01-22'),
(48, '2011-01-23'),
(25, '2011-01-23'),
(63, '2011-02-19');

SELECT ID, remind_date
FROM
(
    SELECT @prev_id := -1
) AS vars
STRAIGHT_JOIN
(
    SELECT
        ID,
        remind_date,
        @prev_id AS prev_id,
        @prev_id := id
    FROM table1
    ORDER BY remind_date, ID
) T1
WHERE prev_id = 25

結果:

ID remind_date
48 2011-01-23
于 2010-07-29T21:07:08.607 に答える
0

条件WHEREID<>MY_LAST_IDを追加します。これはトリプル以上の同じ日付では機能しないため、(4,5,6)のようにすでに取得されたIDを配列に収集できます-array_push()を参照し、「、」で暗黙的に文字列に変換します(YOUR_IDS_STRINGと呼びましょう) )そしてクエリに追加します:

WHERE id NOT IN( YOUR_IDS_STRING )

そして、各クエリがチェックを行った後、日付が変更されましたか?変更された場合は、配列の設定を解除して最初から開始できます(これは必須ではありませんが、YOUR_ID_STRINGは必要な期間だけであるため、パフォーマンスが向上します)。

ページがクエリ間で更新されている場合は、セッション変数、_GET、またはCookieにYOUR_ID_STRINGをプッシュして、演算子で次のIDを連結してみてください。=

于 2010-07-29T20:54:26.850 に答える