Php MySQL中的前向记录与主数据库中的数据相同
我有一个表,它首先按提醒日期排序,然后按ID排序 表如下所示:Php MySQL中的前向记录与主数据库中的数据相同,php,mysql,sorting,next,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前端来前后移动记录。我想有前进和后退按钮,但我遇到了一个问题,两个提醒日期是相同的 请注意,ID不是按顺序排列的,它们在这里,但在实际的数据库中,它们在按日期排序时混淆了 我使用的select语句是:$iid是我
ID | remind_date
1 2011-01-23
2 2010-02-21
4 2011-04-04
5 2011-04-04
6 2009-05-04
我使用一个PHP前端来前后移动记录。我想有前进和后退按钮,但我遇到了一个问题,两个提醒日期是相同的
请注意,ID不是按顺序排列的,它们在这里,但在实际的数据库中,它们在按日期排序时混淆了
我使用的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
那么当我到达相同的日期时会发生什么呢?它跳过了一个,因为它要求提醒\ u date>
如果我使用提醒日期>=它将返回当前记录。我的解决方案是使用limit 2,并通过PHP检查第一条记录是否=我的当前ID,是否使用了下一条记录。但它有3个相同的日期或4个等
我也考虑过使用ID字段,但由于它们的顺序不正确,我无法添加ID>iid
有什么想法吗?除了两个相同的日期外,它工作得很好。添加一个IDMY\u LAST\u ID的条件。这不能用于三个或更多相同的日期,因此您可以将已获取的ID收集到数组中,如4,5,6-请参阅数组推送,使用内爆,将其转换为字符串让我们将其称为您的\u ID\u字符串并添加到查询中:
WHERE id NOT IN( YOUR_IDS_STRING )
在每个查询进行检查之后,date是否已更改,如果已更改,则可以取消设置数组并从头开始。这并不是必需的,但可以提供更高的性能,因为您的\u ID\u字符串只需要所需的长度即可
如果您的页面在两次查询之间刷新,可能尝试将您的\u ID\u字符串推送到会话变量\u GET或cookies中,然后简单地通过运算符连接下一个ID。=添加一个IDMY\u LAST\u ID的条件。这不能用于三个或更多相同的日期,因此您可以将已获取的ID收集到数组中,如4,5,6-请参阅数组\u push,用,要转换为字符串,我们将其称为\u id\u字符串并添加到查询中:
WHERE id NOT IN( YOUR_IDS_STRING )
在每个查询进行检查之后,date是否已更改,如果已更改,则可以取消设置数组并从头开始。这并不是必需的,但可以提供更高的性能,因为您的\u ID\u字符串只需要所需的长度即可
如果您的页面在两次查询之间刷新,可以尝试将您的\u ID\u字符串推送到会话变量\u GET或cookies中,只需由操作员输入下一个ID即可。=您可能可以使用以下方法:
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
您可能可以使用以下选项:
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
我使用了Mark Byers提供的代码,并对其进行了一些小的修改,使其能够在相反的方向上导航,并通过其他列,而不仅仅是日期和ID: $results=$mysqli->querySELECT*FROM SELECT@prev_id:=-1 AS vars stright_JOIN SELECT*,@prev_id AS prev_id,@prev_id:=来自my_表的id ORDER BY data,id T1,其中prev_id=.$id $results=$mysqli->querySELECT*FROM SELECT@next_id:=1 AS vars stright_JOIN SELECT*,@next_id AS next_id,@next_id:=id FROM my_table ORDER BY data DESC,id DESC T1,其中next_id=.$id 我在重复的日期对它进行了测试,它可以很好地通过显示有以下内容的记录列表导航:
$results=$mysqli->querySELECT*从my_表中按数据说明、ID说明排序 我使用了Mark Byers提供的代码,并对其进行了一些小的修改,使其能够在相反的方向上导航,并通过其他列,而不仅仅是日期和ID: $results=$mysqli->querySELECT*FROM SELECT@prev_id:=-1 AS vars stright_JOIN SELECT*,@prev_id AS prev_id,@prev_id:=来自my_表的id ORDER BY data,id T1,其中prev_id=.$id $results=$mysqli->querySELECT*FROM SELECT@next_id:=1 AS vars stright_JOIN SELECT*,@next_id AS next_id,@next_id:=id FROM my_table ORDER BY data DESC,id DESC T1,其中next_id=.$id 我在重复的日期对它进行了测试,它可以很好地通过显示有以下内容的记录列表导航:
$results=$mysqli->querySELECT*从my_表中按数据说明、ID说明排序 我有一个这样的数据集:[45 | 2011-01-14][23 | 2011-01-22][48 | 2011-01-23][25 | 2011-01-23][63 | 2011-02-19]它是45,23,25。。跳过48秒。还有其他想法吗???@Phil:我已经用$iid=25测试了你在评论中提供的测试数据,它运行良好,返回id=48的记录。尝试在更新的答案中运行提供的测试代码。您可以在MySQL查询浏览器中运行它,查看它是否适合您自己。我想你的问题一定在代码的其他地方。马克,你是对的!它确实有效。非常感谢你!你留了很多头发,现在会留在我头上;我有一个这样的数据集:[45 | 2011-01-14][23 | 2011-01-22][48 | 2011-01-23][25 | 2011-01-23][63 | 2011-02-19]它是45,23,25。。跳过48秒。还有别的想法吗
s???@Phil:我已经用你在评论中提供的测试数据对它进行了测试,测试数据为$iid=25,它工作正常,返回的记录id=48。尝试在更新的答案中运行提供的测试代码。您可以在MySQL查询浏览器中运行它,查看它是否适合您自己。我想你的问题一定在代码的其他地方。马克,你是对的!它确实有效。非常感谢你!你留了很多头发,现在会留在我头上;