我有一个存储竞赛条目的表格。参赛者必须输入文字,并且可以选择上传照片
当我在页面上显示条目时,我一次分页到 9 个。
如何尽可能确保每一页至少包含一个带有照片的条目(假设每页有足够的照片条目)?在页面之间均匀分布带有照片的条目可能就足够了
我有一个存储竞赛条目的表格。参赛者必须输入文字,并且可以选择上传照片
当我在页面上显示条目时,我一次分页到 9 个。
如何尽可能确保每一页至少包含一个带有照片的条目(假设每页有足够的照片条目)?在页面之间均匀分布带有照片的条目可能就足够了
我建议您随机排序行:
order by rand()
这并不能保证每页上都有一张照片,但它会有所帮助。
另一种方法是执行以下操作:
select *, @seqnum:=@seqnum+1
from t
where nophoto
select *, @seqnum:=@seqnum+8
from t
where photo
然后按seqnum排序。使这变得麻烦的是处理每页少于一张照片和多张照片的情况。随机方法可能就足够了。
对于每一页,执行以下操作(例如,对于第 3 页,页面大小为 10):
select ...
from ...
where has_photo
order by created
limit 3, 1
union
select ...
from ...
where not has_photo
order by created
limit 27, 9
此查询将两种类型的行分解为两个由联合重新组合的单独查询。
这是我最近看到的更具挑战性的问题之一——谢谢!我无法使用单个 SQL 语句让它工作,但我能够让它像这样工作(至少它看起来)。基本上,它会尝试确定将返回多少结果,然后其中有多少有照片,并使用照片的百分比除以页数(使用 CEILING 确保前几页至少有一个)。
无论如何,这里是:
SET @page = 1;
SET @resultsPerPage = 9;
SELECT @recCount:= COUNT(Id) as RecCount
FROM Entries;
SELECT @photoCount:= COUNT(Photo) as PhotoCount
FROM Entries
WHERE Photo IS NOT NULL;
SET @pageCount = CEILING(@recCount/@resultsPerPage);
SET @photosPerPage = CEILING(@photoCount/@pageCount);
SET @nonPhotosPerPage = @resultsPerPage - CEILING(@photosPerPage);
SELECT *
FROM (
SELECT *,
@rownum := @rownum + 1 row_number
FROM Entries JOIN (SELECT @rownum := 0) r
WHERE Photo IS NOT NULL
) a
WHERE a.row_number > (@photosPerPage*(@page-1))
and a.row_number <= (@photosPerPage*(@page))
UNION
SELECT *
FROM (
SELECT *,
@rownum2 := @rownum2 + 1 row_number
FROM Entries JOIN (SELECT @rownum2 := 0) r
WHERE Photo IS NULL
) b
WHERE b.row_number > (@nonPhotosPerPage*(@page-1))
and b.row_number <= (@nonPhotosPerPage*(@page))
还有SQL 小提琴。
祝你好运!