【问题标题】:Getting next row in mysql query在mysql查询中获取下一行
【发布时间】:2019-05-15 05:01:40
【问题描述】:

假设我有一个查询: 选择 * 从表 在这种情况下,我可以获取 id 和 -1 或 +1 id 以获取下一行或上一行。

但如果我有 SELECT * FROM table WHERE name LIKE ..... 我会得到几行,它们不会按 id 排序,我怎么能得到下一行或上一行?

我的目标是创建一个具有下一个和上一个按钮的画廊,其中包含指向下一个或上一个图像的链接。

这个画廊可以通过多种不同的方式进行排序和分类。

在这种情况下是否可以检测到哪一行是下一行或上一行?

【问题讨论】:

  • 选择三个 ID 并在输出中使用它们。

标签: php mysql


【解决方案1】:

您必须添加名为“GalleryID”或类似的列并从搜索查询中获取 GalleryID,而不是按 GalleryID 选择所有照片并按 ID 排序,现在您有了排序照片的列表,例如:

$queryResult = $db->query("SELECT GalleryID FROM table WHERE name LIKE '%WHAT I WANT%'")->fetchall();
$GalleryID = $queryResult[0]['GalleryID'];
$photos = $db->query("SELECT ID FROM table WHERE GalleryID = $GalleryID order by ID asc")->fetchall();

现在你可以玩 INDEX 了;

$index = 0; // Current photo index
//Get next photo
$index++;
if($index < count($photos))
    $photoUrl = $db->query("select url from table where ID = $photos[$index] limit 1");

// Get the previous photo
$index--;
if($index >= 0)
    $photoUrl = $db->query("select url from table where ID = $photos[$index] limit 1");

【讨论】:

  • 这假设表的 ID 没有间隙。另外我建议使用参数化查询。
  • @user3783243 不,如果GalleryID存在,则间隙没有问题
  • @user3783243 此代码通过数组索引获取下一张照片,而不是直接照片 id
【解决方案2】:

这绝不是通过 ID 在元素之间导航的好方法...因为 ID 是唯一的,但不是您想要的顺序。

更好的方法是将结果存储在数组(或其他可迭代结构)中,然后您可以按元素导航(在您的情况下为行)。

极简算法:

var results[];
results = query("Your SQL query here");
var currentIndex = 0;

var nextRow = results[currentIndex + 1];
var previousRow = results[currentIndex - 1];

【讨论】:

    【解决方案3】:

    嗯,你可以这样做

    SELECT id,
           ...
           FROM images
           WHERE name LIKE '...'
                 ...
                 AND (:id IS NULL
                       OR id > :id)
           ORDER BY id
           LIMIT 1;
    

    :id 是 ID 的参数。在您的第一页上将其设置为NULL。由于WHERE 中的OR 分支,记录不会被ID 过滤。在任何后续页面上,将其设置为上一页的 ID。将过滤记录以获取更大的 ID。由于ORDER BY idLIMIT 1,您将始终获得ID 最少的记录(当然,如果存在的话)。

    您也可以省略 :id IS NULL 部分并直接执行

    SELECT id,
           ...
           FROM images
           WHERE name LIKE '...'
                 ...
           ORDER BY id
           LIMIT 1;
    

    在第一页和

    SELECT id,
           ...
           FROM images
           WHERE name LIKE '...'
                 ...
                 AND id > :id
           ORDER BY id
           LIMIT 1;
    

    在任何后续页面中,将 :id 设置为当前页面的 ID。

    你可以使用其他方向

    SELECT id,
           ...
           FROM images
           WHERE name LIKE '...'
                 ...
                 AND id < :id
           ORDER BY id
           LIMIT 1;
    

    只需将id 设置为当前页面的ID。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2011-08-20
      • 1970-01-01
      • 2015-08-04
      • 2012-02-02
      • 2011-10-26
      • 2013-05-02
      相关资源
      最近更新 更多