【问题标题】:How can I get the nearest rows in mysql?如何获取mysql中最近的行?
【发布时间】:2011-08-25 13:47:41
【问题描述】:

假设我正在尝试构建某个画廊的缩略图(显示 5 个缩略图)。如何让我的mysql显示5个缩略图,中间的缩略图将是炸毁的图像,中间左侧的两个是以前的图像,中间右侧的另外两个图像将是2个以上之后的图像。

编辑


我知道如何用这样的方式轻松获得 5 个缩略图

$sqlThumb = mysql_query("SELECT iID,thumbnails,userID FROM images WHERE userID = ".$_SESSION['userID']." ORDER BY iID ASC LIMIT 1,5");

但问题是,我没有一致的 id(意思是,会有删除和插入)。它基于用户拥有的图像。

iID            userID 
-----          --------
1              5
2              4
3              4
4              5
5              5
6              5
10             5
11             5
12             5

因此,如果用户单击 iID 编号为 5 的图像,缩略图应按如下顺序显示,即 1、4、5、6、10。

但是,如果用户点击 10 号缩略图,缩略图应显示:5、6、10、11、12。

【问题讨论】:

  • 我已经更新了我的帖子,以澄清我的问题
  • 你试过我的查询吗?如果只想从特定用户那里获取,只需在 where 子句中添加 AND userID = ".$_SESSION['userID']."

标签: php mysql


【解决方案1】:

试试这个

$offset = $current_id-3;

 (SELECT * FROM TBL WHERE id < '$current_id'    limit '$offset',2 )
 union( SELECT * FROM TBL WHERE id = '$current_id') 
 union (SELECT * FROM TBL WHERE id > '$current_id' limit 2)

【讨论】:

  • 从这个查询看,你是把 $current_id 减去 3 吗?
  • @andewwliu:是的,当然,您需要找到偏移量才能获得前两条记录。为什么您发现查询中有任何错误。任何不相关的结果
  • 我正在努力工作。但我应该用mysql_query(" (SELECT * FROM TBL WHERE id &lt; '$current_id' limit '$offset',2 ) union( SELECT * FROM TBL WHERE id = '$current_id') union (SELECT * FROM TBL WHERE id &gt; '$current_id' limit 2)");?
  • @andrewliu:不明白你在问什么。但我在发布我的答案之前测试了该查询是否有效。只需替换表名正确的列名,然后在 where clauss 中添加任何条件,如果你愿意的话。是有帮助
【解决方案2】:

我不知道这是否有效,但想法是有一个名为row_number 的属性。您将通过 id 和最后两个以及接下来的两个通过行号获得所需的图像。

SELECT iID,thumbnail FROM image_collection,
   (SELECT iID, thumbnail, row_number
   FROM
      (SELECT iID,thumbnail,
      @curRow := @curRow + 1 AS row_number
      FROM image
      WHERE userID = 5
      ORDER BY iID) as image_collection
   WHERE s_image.iID = 10) as image_selected
WHERE image_collection.row_number BETWEEN image_selected.row_number - 2 AND image_selected.row_number + 2

我没有测试它,因为我没有运行 MySQL,但我看到如何将行号放在这里:With MySQL, how can I generate a column containing the record index in a table?

【讨论】:

    【解决方案3】:

    试试这个(不包括任何减法):

    $id = 5;
    $user_id = $_SESSION['userID'];
    
    $sqlThumb = mysql_query("
    SELECT iID FROM images WHERE userID = ".$user_id." AND iID = ".$id."
      UNION (SELECT iID FROM images WHERE userID = ".$user_id." AND iID < ".$id." ORDER BY iID DESC LIMIT 2) 
      UNION (SELECT iID FROM images WHERE userID = ".$user_id." AND iID > ".$id." ORDER BY iID ASC LIMIT 2) 
      ORDER BY iID ASC")
    

    【讨论】:

    • :you didn't use offset in ** UNION (SELECT iID FROM images WHERE userID = ".$user_id." AND iID
    • @gowri:感谢您注意到这一点,应该是ORDER BY iID *DESC*。我已经编辑了答案,它工作正常。
    • 还是你错了 desc 会改变顺序所以结果是 5,4,6,7,8。所以你不能使用这个查询得到正确的顺序
    • @gowri:你错了,最后一行的ORDER BY iID ASC 适用于所有三个子查询的结果,因此最终结果将正确排序(此处为 4,5,6,7,8案例)。
    • :是的,我错过了那部分。让我们看看OP的回应
    猜你喜欢
    • 2012-01-04
    • 2012-10-13
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2014-03-10
    相关资源
    最近更新 更多