使用主数据库中的相同DATA在MySQL中转发回记录

时间:2010-07-29 20:43:07

标签: php mysql sorting next

我有一个表,按照提醒日期排序,然后是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不是有序的,它们在这里,但在实际的数据库中,它们在按remder_date排序时会混淆

我使用的select语句是:($ 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

所以当我到达相同的日期时会发生什么,因为它要求remind_date>。

如果我使用remind_date> =它会返回当前记录。我的解决方案是使用限制2并通过PHP检查第一条记录是否是我当前的ID,如果确实使用了下一条记录。但它有3个相同或4等日期。

我还考虑过使用ID字段,但由于它们无序,我无法添加ID> $ IID。

有什么想法吗?除了两个相同的日期外,它的效果很好。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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将只需要很长时间)。

如果您的页面在查询之间刷新,可能会尝试在会话变量,_GET或Cookie中推送YOUR_ID_STRING,并简单地按运算符连接下一个ID。=

答案 2 :(得分:0)

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

import __React from "react"

$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);