3

我有一个存储竞赛条目的表格。参赛者必须输入文字,并且可以选择上传照片

当我在页面上显示条目时,我一次分页到 9 个。

如何尽可能确保每一页至少包含一个带有照片的条目(假设每页有足够的照片条目)?在页面之间均匀分布带有照片的条目可能就足够了

4

3 回答 3

0

我建议您随机排序行:

order by rand()

这并不能保证每页上都有一张照片,但它会有所帮助。

另一种方法是执行以下操作:

select *, @seqnum:=@seqnum+1
from t
where nophoto
select *, @seqnum:=@seqnum+8
from t
where photo

然后按seqnum排序。使这变得麻烦的是处理每页少于一张照片和多张照片的情况。随机方法可能就足够了。

于 2013-01-23T00:24:33.437 回答
0

对于每一页,执行以下操作(例如,对于第 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

此查询将两种类型的行分解为两个由联合重新组合的单独查询。

于 2013-01-23T00:32:03.510 回答
0

这是我最近看到的更具挑战性的问题之一——谢谢!我无法使用单个 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 小提琴

祝你好运!

于 2013-01-23T02:12:45.350 回答