IDを知っている前と次のレコードを選択します

最近、ウォッチページに[GO] [BACK]ボタンを表示する問題に遭遇しました。 しかし、問題の複雑さは、テーブルの任意のフィールドでソートできることです。



問題文:



CREATE TABLE `contacts`(

`id` int(11)NOT NULL AUTO_INCREMENT、

`name_prefix` varchar(50)DEFAULT NULL、

`name` varchar(100)DEFAULT NULL、

`infix` varchar(100)DEFAULT NULL、

`surname` varchar(100)NOT NULL、

`primary_email` varchar(100)DEFAULT NULL、

主キー( `id`)

)エンジン= MyISAM AUTO_INCREMENT = 3 DEFAULT CHARSET = utf8;



明確にするために、すべてが機能する場所を説明します。

このテーブルで動作する2つのページがあります。

-インデックス、連絡先テーブルのすべてのエントリを表示します。フィルタがあり、列でソートされています

-表示、連絡先テーブルから現在のレコードを表示します。 このページには[GO] [BACK]ボタンがあり、インデックスページで指定されたフィルターと並べ替えを考慮します。

これらの2つのボタンには困難が伴いました。



したがって、タスクは、フィルターと任意の並べ替え(任意のフィールドによる)を考慮して、現在のIDに関連する前および次のレコードのID取得することです。



IDによる並べ替えがあった場合-固定された並べ替えですべてが明確になり、質問も解決されたようですhttp://habrahabr.ru/blogs/mysql/85945/



簡潔さと繊細さのために、PHPを使用したソリューションを紹介します。

解決策:

/* .*/

$sqlConditions = " WHERE name ='test' " ;

$sqlOrder = " ORDER BY name, surname" ;

$curId = 33; //ID



/* , , id */

$sql = "SELECT rownumb,id FROM (

SELECT

@rownumb := @rownumb+1 AS rownumb,

`Contact`.`id` FROM `contacts` AS `Contact`

,(SELECT @rownumb := 0) al

$sqlConditions $sqlOrder

) AS src "
;



/* */

$rowNumber = $ this ->query($sql. " WHERE src.id = $curId" );



/* */

if (!empty($rowNumber[0][ 'src' ][ 'rownumb' ])) {

$rowNumber = $rowNumber[0][ 'src' ][ 'rownumb' ];

} else {

return false ;

}



if ($rowNumber > 1) { /* $rowNumber > 1 ( )*/

/* rownumb*/

$res = $ this ->query($sql. " WHERE id <> $curId LIMIT " .($rowNumber - 2). " ,2" );

/* prevId*/

if (!empty($res[0][ 'src' ][ 'id' ])){

$result[ 'prevId' ] = $res[0][ 'src' ][ 'id' ];

}

/* NextId */

if (!empty($res[1][ 'src' ][ 'id' ])){

$result[ 'nextId' ] = $res[1][ 'src' ][ 'id' ];

}

} else { /* $rowNumber == 1 */

/* */

$res = $ this ->query($sql. " WHERE rownumb > $rowNumber LIMIT 1" );

/* NextId*/

if (!empty($res[0][ 'src' ][ 'id' ])){

$result[ 'nextId' ] = $res[0][ 'src' ][ 'id' ];

}

}




* This source code was highlighted with Source Code Highlighter .








まあ、それがすべてです。 誰もがよりエレガントなウェルカムソリューションをお持ちの場合!



All Articles