如何根据列分发记录

时间:2013-01-22 23:15:40

标签: mysql sql distribution

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

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

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

3 个答案:

答案 0 :(得分:0)

我建议您随机订购行:

order by rand()

这不保证每张照片都有照片,但有帮助。

另一种方法是做这样的事情:

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

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

答案 1 :(得分: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

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

答案 2 :(得分: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 Fiddle

祝你好运!