Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL中的前向记录与主数据库中的数据相同_Php_Mysql_Sorting_Next - Fatal编程技术网

Php MySQL中的前向记录与主数据库中的数据相同

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排序

表如下所示:

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查询浏览器中运行它,查看它是否适合您自己。我想你的问题一定在代码的其他地方。马克,你是对的!它确实有效。非常感谢你!你留了很多头发,现在会留在我头上;