MySQL:包含记录的显示页面

时间:2011-09-01 22:15:28

标签: mysql

假设以下记录:

ID  Value
=========
1.  No
2.  No
3.  No
4.  No
5.  No
6.  No
7.  Yes
8.  No
9.  No
10. No

我的记录显示的每个“页面”包含5条记录(因此第1页有记录1-5,第2页有记录6-10,依此类推......)。我想显示包含值为Yes的记录的页面。请记住,我真的不知道记录中Yes的位置。

如何查询?

4 个答案:

答案 0 :(得分:3)

这样的事情怎么样:

/* Work out the page */
SELECT @MatchID = ID
  FROM tbl
  WHERE Value = 'Yes'
  ORDER BY ID ASC
  LIMIT 1;

SELECT @Page = CEIL(COUNT(*) / 5)
  FROM tbl
  WHERE ID <= @MatchID;

/* Select the items on that page */
SET @Offset = (@Page - 1) * 5;

SELECT *
  FROM tbl
  ORDER BY ID ASC
  LIMIT @Offset, 5;

注意:以上内容不适合找不到@MatchID。

我不确定MySQL限制是否必须是常量,因此如果它们必须计算PHP中的偏移量,或者用于连接MySQL的任何编程语言。或者,这可能会起作用,而不是上例中的最后一个SELECT语句:

SET @selectSQL = CONCAT('SELECT * FROM tbl ORDER BY ID ASC LIMIT ', @Offset, ', 5');
PREPARE stmt FROM @selectSQL;
EXECUTE stmt;

答案 1 :(得分:0)

SELECT ID FROM tbl WHERE Value = "Yes" Order by ID ASC LIMIT 1;

将ID划分为“每页记录数”(在您的情况下:5)。 然后你得到第一个是 - 记录存在的“页面”。

假设您的ID是主键(auto_increment)并且没有间隙。

答案 2 :(得分:0)

好吧,我想我现在得到了这个。 选择与Value ='YES'

的记录在同一页面上的所有记录
SET @c:=0;
SELECT tbl.* FROM tbl WHERE CEIL((@c:=@c+1) / 5) = (SELECT CEIL(COUNT(temp_table.id) / 5) FROM tbl temp_table WHERE temp_table.id <= (SELECT temp2.id FROM tbl temp2 WHERE temp2.value = 'YES')) ORDER BY tbl.id ASC;

答案 3 :(得分:0)

SELECT Value, ID / 5 AS Page WHERE Value = "Yes"

修改

SELECT Value, ID DIV 5  + 1 AS Page WHERE Value = "Yes"