在mysql查询中获取下一行

时间:2019-05-14 20:28:59

标签: php mysql

假设我有一个查询: SELECT * FROM表 在这种情况下,我可以获取ID以及-1或+1以获得下一行或上一行。

但是如果我有 SELECT * FROM表WHERE名称LIKE ..... 我会得到几行,而不会按ID排序,我怎么能得到下一行或上一行?

我的目标是创建一个具有下一个和上一个按钮以及指向下一个或上一个图像的链接的回廊。

此Galleri可以通过许多不同的方式进行排序和排序。

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

3 个答案:

答案 0 :(得分:0)

您必须添加名为“ 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");

答案 1 :(得分:0)

嗯,你可以做类似的事情

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

:id是ID的参数。在您的第一页上,将其设置为NULL。由于OR中的WHERE分支,因此该记录将不会被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。

答案 2 :(得分:0)

这从来都不是通过ID在元素之间导航的好方法...因为ID是唯一的,但是没有按需要排序。

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

极简算法:

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

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