2013-05-15 45 views
0

我熟悉分页,因为我可以选择基于页面数,像这样的一组用户:用户选择按字母顺序基于特定的ID

// setup pagination 
$page = 1; 
$display = 5; 
$start = $display * $page - $display; 

$sql = "SELECT * FROM users WHERE valid = 'Y' ORDER BY :username ASC LIMIT :start, :display"; 
$sth = $this->db->prepare($sql); 
$sth->bindValue(':username', $username, PDO::PARAM_STR); 
$sth->bindValue(':start', $start, PDO::PARAM_INT); 
$sth->bindValue(':display', $display, PDO::PARAM_INT); 
$sth->execute(); 
$result = $sth->fetchAll(PDO::FETCH_ASSOC); 

我试图找出是如何做类似的事情,而不是一个页码我有一个用户ID。例如,给定用户标识“3”和显示限制为“3”,我想要在用户按字母顺序前后(总共三个用户)之前和用户一起选择该用户。我希望这是有道理的..

任何关于如何解决这个问题的建议?

回答

3

下面是使用三个子查询与union all相结合的方法:

(select * 
from users 
where valid = 'Y' and username < :username 
order by username desc 
limit 1 
) 
union all 
(select * 
from users 
where valid = 'Y' and username = :username 
order by username desc 
limit 1 
) 
union all 
(select * 
from users 
where valid = 'Y' and username > :username 
order by username 
limit 1 
) 
2

这里有一个想法...

SELECT * FROM ints; 
+---+ 
| i | 
+---+ 
| 0 | 
| 1 | 
| 2 | 
| 3 | 
| 4 | 
| 5 | 
| 6 | 
| 7 | 
| 8 | 
| 9 | 
+---+ 

(SELECT * FROM ints WHERE i >= 3 ORDER BY i LIMIT 2) 
UNION 
(SELECT * FROM ints WHERE i < 3 ORDER BY i DESC LIMIT 1) 
ORDER BY i; 
+---+ 
| i | 
+---+ 
| 2 | 
| 3 | 
| 4 | 
+---+