【问题标题】:Forward Back Records in MySQL with the same DATA in the primary在 MySQL 中使用相同的 DATA 在主数据库中转发回溯记录
【发布时间】:2011-03-22 23:02:51
【问题描述】:

我有一张表,它按提醒日期排序,然后按 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

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

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

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

有什么想法吗?除了 2 个相同的日期外,它工作得很好。

【问题讨论】:

    标签: php mysql sorting next


    【解决方案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

    【讨论】:

    • 我有一个这样的数据集:[ 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 Query Browser 中运行它,看看它是否适合你自己。我认为您的问题必须在您的代码中的其他地方。
    • 马克,你是对的!它确实有效。非常感谢!你节省了很多现在留在我头上的头发;)
    【解决方案2】:

    添加条件 WHERE IDMY_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。=

    【讨论】:

      【解决方案3】:

      我使用了 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");

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2010-12-03
        • 2018-10-07
        • 1970-01-01
        • 2022-01-13
        • 1970-01-01
        相关资源
        最近更新 更多