我有一个表,按照提醒日期排序,然后是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。
有什么想法吗?除了两个相同的日期外,它的效果很好。
答案 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);