【发布时间】:2011-06-19 12:41:21
【问题描述】:
我在 MySQL 数据库中有一个名为 products 的表。 products 看起来有点像这样:
id name din strength active deleted
1 APA TEST 00246374 25 1 0
4 APA BOB 00246375 50 1 0
5 APA TIRE 00246888 50 1 0
7 APA ROT 00521414 100 1 0
9 APA APA 01142124 100 1 0
6 APA CODE 00121212 150 1 0
8 APA SERV 00011145 600 1 0
显然,我遗漏了几个对我的问题不重要的专栏。当我查询这个表时,我将按几个不同的列之一进行排序(用户界面允许单个用户更改排序列和顺序),并且我可能有一个搜索子句,在这种情况下,我将执行一个 LIKE 子句名称和 DIN。
我想知道的是,给定排序信息和搜索信息,以及特定产品的 ID(假设我搜索了 004,它返回了 3 个结果,我正在查看其中一个),我怎么能得到下一个和以前的产品?
我需要这样做,因为如果用户在搜索和排序结果后点击编辑/查看其中一个产品,他们希望能够在不转到上一页的情况下循环浏览结果。
在 SQL 中是否有一种很好且有效的方法来执行此操作,或者我最好还是使用 PHP?也欢迎任何想法。
当前使用此 SQL 查询,如果我按 strength 列排序会遇到问题,因为存在重复值
SELECT T.*
FROM `wp_products` T
INNER JOIN `wp_products` curr on curr.id = 38
AND ((T.strength = curr.strength and T.id < curr.id)
OR (T.strength > curr.strength))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE '%%' OR T.din LIKE '%%')
ORDER BY T.strength ASC, T.id ASC
LIMIT 1
我的 PHP 代码(使用 WordPress)(旨在获取下一项)
$sql = 'SELECT T.*
FROM `' . $wpdb->prefix . 'apsi_products` T
INNER JOIN `' . $wpdb->prefix . 'apsi_products` curr on curr.id = ' . $item->id . '
AND ((T.' . $wpdb->escape( $query['orderby'] ) . ' = curr.' . $wpdb->escape( $query['orderby'] ) . ' and T.id > curr.id)
OR (T.' . $wpdb->escape( $query['orderby'] ) . ' > curr.' . $wpdb->escape( $query['orderby'] ) . '))
WHERE T.active = 1 AND T.deleted = 0 AND (T.name LIKE \'%' . $query['where'] . '%\' OR T.din LIKE \'%' . $query['where'] . '%\')
ORDER BY T.' . $wpdb->escape( $query['orderby'] ) . ' ' . $query['order'] . ', T.id ASC
LIMIT 1;';
【问题讨论】:
标签: php sql mysql pagination