php - 如何优化这个 mysql/php 查询?

标签 php mysql database

我的页面显示一张图片,我想显示与当前图片相关的上一张和下一张图片。目前我运行相同的查询 3x 并修改 "where"声明 =, >, < .

它有效,但我觉得必须有更好的方法来做到这一点。

图像 ID 不是 1、2、3、4、5。可能是 1、2、10、20、21 等。但如果它更有效率,我愿意改变它。

mysql_select_db("database", $conPro);
$currentid = mysql_real_escape_string($_GET['currentid']);
$query ="SELECT * FROM database WHERE id ='".$currentid."' LIMIT 1 ";
$result = mysql_query($query,$conPro) or die(mysql_error());
$affected_rows = mysql_num_rows($result);                               
if ($affected_rows==1)
    { 
        $row = mysql_fetch_array($result)or die ('error:' . mysql_error());     
        $current_id = $row['id'];
        $current_header = $row['title'];
        $current_description =$row['desc'];
        $current_image = "http://".$row['img'];
        $current_url = "http://".$row['id']."/".$db_title."/";
        $current_thumb = "http://".$row['cloud'];
}

mysql_select_db("database", $conPro);   
$query ="SELECT * FROM database WHERE id <'".$currentid."' ORDER BY id DESC LIMIT 1 ";
$result = mysql_query($query,$conPro) or die(mysql_error());
$affected_rows = mysql_num_rows($result);                               
if ($affected_rows==1)
    { 
    $row = mysql_fetch_array($result)or die ('error:' . mysql_error()); 
        $previous_id = $row['id'];
        $previous_header = $row['title'];
        $previous_description =$row['desc'];
        $previous_image = "http://".$row['img'];
        $previous_url = "http://".$row['id']."/".$db_title."/";
        $previous_thumb = "http://".$row['cloud'];
    }else{
        $previous_none = "true"; //no rows found
    }

mysql_select_db("database", $conPro);   
$query ="SELECT * FROM database WHERE id >'".$currentid."' ORDER BY id ASC LIMIT 1 ";
$result = mysql_query($query,$conPro) or die(mysql_error());
$affected_rows = mysql_num_rows($result);                               
if ($affected_rows==1)
    { 
    $row = mysql_fetch_array($result)or die ('error:' . mysql_error()); 
        $next_id = $row['id'];
        $next_header = $row['title'];
        $next_description =$row['desc'];
        $next_image = "http://".$row['img'];
        $next_url = "http://".$row['id']."/".$db_title."/";
        $next_thumb = "http://".$row['cloud'];
    }else{
        $next_none = "true"; //no rows found
        }
mysql_close($conPro);

谢谢你的时间

最佳答案

您不必每次都执行 select_db。一旦您“选择”了一个数据库,它就会保持选中状态,直到您选择其他内容为止。

您无法真正避免执行两个单独的查询来获取下一张/上一张图像,但您可以使用联合查询来伪造它:

(SELECT 'next' AS position, ...
FROM yourtable
WHERE (id > $currentid)
ORDER BY id ASC
LIMIT 1)

UNION

(SELECT 'prev' AS position, ...
FROM yourtable
WHERE (id < $currentid)
ORDER BY id DESC
LIMIT 1)

这将返回两行,其中包含一个名为“position”的伪字段,它可以让您轻松识别哪一行是“下一条”记录,哪一行是“上一条”记录。请注意,括号是必需的,以便“order by”子句适用于各个查询。如果没有,mysql 将从并集序列中的最后一个查询中获取 order by 子句,并将其应用于完整的并集结果。

关于php - 如何优化这个 mysql/php 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8860868/

相关文章:

php将日期时间转换为UTC

mysql - 未记录的 MySQL 对多个单词使用 LIKE 运算符

mysql - 如何显示mysql数据库中的隐藏表

database - Perl 5 从用户那里获取输入并从数据库中的表中删除

c++ - QT Sqlite 无法获取行。数据库锁定

php - 在一个地方定义一次根路径

php - 如何在 yii2 中创建自定义确认框

php - 连接三个表 mysql php,但没有回显

mysql - 如何检测像 “helpme” 这样的字符串的两个单词?

python - Django 在没有 Q 的情况下组合两个查询