問題文:
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 .
まあ、それがすべてです。 誰もがよりエレガントなウェルカムソリューションをお持ちの場合!