2013-01-22 43 views
3

分發記錄我有一個表存儲競爭條目。 參賽者必須輸入文字並可以選擇上傳照片如何根據列

當我在頁面上顯示條目時,我一次對9個分頁。

如何儘可能確保每個頁面至少包含一張帶有照片的條目(假設每頁有足夠的照片條目)?或許,這將是足夠的分發帶有照片的條目之間均勻

+1

你並不關心顯示順序,只是照片均勻分佈,對不對? – Strawberry

+0

正確 - 最好按照提交的順序,但不是很重要 – Mark

+0

嗯,棘手..... – Strawberry

回答

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

祝你好運!

0

頁我建議你隨機的行排序:

order by rand() 

這並不能保證每個頁面上的照片,但它幫助。

另一種方法是做這樣的事情:通過SEQNUM

select *, @seqnum:[email protected]+1 
from t 
where nophoto 
select *, @seqnum:[email protected]+8 
from t 
where photo 

然後排序。這種麻煩的處理方式是處理每頁少於一張照片和多張照片的情況。隨機方法可能就足夠了。

+0

我不知道這會有什麼幫助,因爲沒有理由爲什麼它贏了;無論如何t是一個隨機分佈 - 它不是像照片記錄分組 – Mark

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 

此查詢兩種類型的行分解成由聯合重組兩個單獨的查詢。

+0

我想到了 - 但只有當我知道的比例非照片的照片 – Mark

+0

所以做一個查詢首先發現 – Bohemian