MySQL:包含记录的显示页面

MySQL:包含记录的显示页面,mysql,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,依此类推。。。。我想显示包含值为“是”的记录的页面。请记住,我真的不知道这个“是”在记录中的什么位置 我如何质疑这一点 SELECT ID FROM tbl WHERE Value = "Yes" Order by

假设以下记录:

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,依此类推。。。。我想显示包含值为“是”的记录的页面。请记住,我真的不知道这个“是”在记录中的什么位置

我如何质疑这一点

SELECT ID FROM tbl WHERE Value = "Yes" Order by ID ASC LIMIT 1;
将ID除以案例中每页的记录:5。 然后得到第一条yes记录所在的页面


假设您的ID是主键自动递增且没有间隙。

好的,我想我现在知道了。 选择与值为“是”的记录在同一页上的所有记录

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;
编辑


像这样的怎么样:

/* 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;

breiti,ID是一个主键,自动递增。然而,我不能保证不会有任何差距。记录中只有一个是值。这有帮助吗?这将返回记录6-10?这将只返回值为“是”的记录-在您的情况下,返回ID为7的记录。您让我认为查询将返回一个基于0的数字,对于1-5中的记录为0,对于5-10中的记录为1。我将修改查询以反映真实的页码。如果前面有评论,即ID中可能存在空白,那么这可能不起作用。查询返回给我2.4。我真正需要的是记录6-10。建议?列ID的确切类型是什么?我假设它是一个整数-我想不是。布莱恩,我应该用地板来代替吗?第2.4页仍然是第2页。我也考虑过这一点,但只做一些例子。例如,11/5=2.2 ceil会给你3,记录11在第3页记录11到15。它是这样工作的,因为没有页面0Ah,你是对的。我实际上不需要页码。在我的例子中,我需要记录6-10。建议?当然,我会马上为你编辑我的答案。用手机很难做到。LolI在我的一个表的phpmyadmin中测试了这个,很不幸,我相信它们必须是常量。即使是像LIMIT 1+2这样的简单表达式也会导致错误。@Brian:谢谢您的检查。也许最新的编辑会起作用;虽然,我必须承认,我不是那种东西的粉丝。是的,这看起来是一个相当聪明的方法。我想我不太熟悉在mysql中使用变量,所以我也不喜欢这个。。。哈哈。我认为我新编辑的答案要简单得多。@Brian:你看到breiti回答中关于ID不一定是连续的的评论了吗?嗯,我想这会让事情变得更复杂。但如果有差距,我认为你的解决方案也行不通?您的解决方案建议,值为'YES'的行是页面的5组中的第一项。但是如果它是所需页面上的第五项呢?我们可能需要一个行计数变量。或者你的解决方案真的有效?我现在很困惑。。。哈哈
SELECT Value, ID DIV 5  + 1 AS Page WHERE Value = "Yes"
/* 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;
SET @selectSQL = CONCAT('SELECT * FROM tbl ORDER BY ID ASC LIMIT ', @Offset, ', 5');
PREPARE stmt FROM @selectSQL;
EXECUTE stmt;