您的位置:首页 > 数据库 > MySQL

mysql in(...) 1次取出当前记录及上1条下1条记录, 且使用了主键作为索引

2012-10-23 01:18 477 查看
mysql 1次取出当前记录及上1条下1条记录,效果非常好!

对于让mysql一次取出当前记录,及上1条、下1条,目前网上那条sign( ID - 3 )...的sql语句反正我是看得云里雾里,

自己写了一条比较清晰的sql语句,就是select ... in ( 4 , 5 , 6 ) 的语句,其中4、5、6通过union 连接起来mysql的任务就完成了。然后用php将mysql给出的数据处理一下,ok。

由于才取3条数据, mysql语句怎么union都不会有什么性能问题的。

-------------------------------------------

一次取出编号为7的记录 和 它的上一条、下一条
SELECT * FROM article
where id in(
SELECT max( id ) FROM article WHERE id < 7
union
select 7
union
SELECT min( id ) FROM article WHERE id > 7
)
结果::



技术细节见下:

1.article表结构: aid( 主键 ) title content ... ,

2.sql语句,

3.php执行和处理 .

<?php

$id = 5; // 假设http://localhost/mycms/?ac=show&id=5 id为5

$sql = "

SELECT * FROM article

where

`aid` in(

SELECT max( `aid` ) FROM article WHERE `aid` < {$id}

union all

SELECT {$id}

union all

SELECT min( `aid` ) FROM article WHERE `aid` > {$id}

)

ORDER BY aid ASC

LIMIT 0,3

";

$list = db::get_all( $sql );

empty( $list ) && exit( '该文章不存在.' );

// 再次遍历, 判断文章编号是否存在.

$aid_exists = false;

$row = array();

foreach ( $list as $n=>$line ){

if ( $id == $line['aid'] ){

$aid_exists = true;

$row = $line; // 当前记录

break;

}

}

false === $aid_exists && exit( '该文章不存在.' );

// 它的后1条

$row['prev'] = isset( $list[$n-1] ) ? $list[$n-1] : false;

// 它的前1条

$row['next'] = isset( $list[$n+1] ) ? $list[$n+1] : false;

// 载入show.html模版

tpl( 'show' , $row );

?>

上述得到 $row 的结构:: ( 黄色背景色是当前的数据, prev next分别是上1条、下1条 )

$row = Array(

[aid] => 5

[title] => 叶斯算法(bayesian)介绍

[prev] => Array(

[aid] => 4

[title] => ffffffffff

)

[next] => Array (

[aid] => 6

[title] => 模式四要素

)

)

----------------

再在show.html 里面写上如下代码::
<style>

#prev_next span{ display: inline-block; width: 260px ; }

</style>

<!-- 前1条、后1条 -->

<div id="prev_next">

<span>

<下一篇:

<?php

if( $next ) {

$next_short = substr( $next['content'] , 0 , 150 );

echo "<a href=\"?ac=show&id={$next['aid']}\" title=\"下1篇:{$next['title']}\n\r{$next_short}\" >".substr( $next['title'] , 0 , 30 ).'</a>';

}

else{

echo ' 没有了 ';

}

?>

</span>

<span style="text-align:right;">

上一篇:

<?php

if( $prev ) {

$prev_short = substr( $prev['content'] , 0 , 150 );

echo "<a href=\"?ac=show&id={$prev['aid']}\" title=\"上1篇:{$prev['title']}\n\r{$prev_short}\" >".substr( $prev['title'] , 0 , 30 ).'</a>';

}

else{

echo ' 没有了 ';

}

?>

>

</span>

</div>

结果是相当满意,如下图::



性能分析::

explain一下上面那条语句:
使用了key: PRIMARY 主键 作为索引,所以性能是可以的.

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐