假设以下记录:
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
的位置。
如何查询?
答案 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"