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 不是按顺序排列的,它们在这里,但在实际数据库中,它们在按提醒日期排序时混淆了

我正在使用的选择语句是:($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

那么当我到达相同的日期时会发生什么,它会跳过一个,因为它要求提醒日期>。

如果我使用提醒日期 >= 它返回当前记录。然后我的解决方案是使用限制 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 提醒日期
48 2011-01-23
于 2010-07-29T21:07:08.607 回答
0

添加条件 WHERE ID<>MY_LAST_ID。这不适用于三个或更多个相同的日期,因此您可以将已获取的 ID 收集到数组中,如 (4,5,6) - 请参阅 array_push(),用“,”将其内爆以转换为字符串(我们称之为 YOUR_IDS_STRING ) 并添加到您的查询中:

WHERE id NOT IN( YOUR_IDS_STRING )

并且在每次查询后进行检查,日期是否已更改,如果更改 - 您可以取消设置数组并从头开始(这不是必需的,但可以为您提供更高的性能,因为 YOUR_ID_STRING 将只是需要的时间)。

如果您的页面在查询之间刷新,则可以尝试将 YOUR_ID_STRING 推送到会话变量、_GET 或 cookie 中,然后通过运算符简单地连接下一个 id。=

于 2010-07-29T20:54:26.850 回答
0

我使用了 Mark Byers 提供的代码,并进行了一些小改动,我对其进行了调整以沿相反的方向导航(并传递其他列,不仅是日期和 ID):

$results = $mysqli->query("SELECT * FROM (SELECT @prev_id := -1) AS vars STRAIGHT_JOIN (SELECT *, @prev_id AS prev_id, @prev_id := ID FROM my_table ORDER BY data, ID) T1 WHERE prev_id = ".$ID);

$results = $mysqli->query("SELECT * FROM (SELECT @next_id := 1) AS vars STRAIGHT_JOIN (SELECT *, @next_id AS next_id, @next_id := ID FROM my_table ORDER BY data DESC, ID DESC) T1 WHERE next_id = ".$ID);

我在重复的日期对其进行了测试,它通过以下显示的记录列表很好地导航:

$results = $mysqli->query("SELECT * FROM my_table ORDER BY data DESC, ID DESC");

于 2016-04-21T19:24:20.713 回答