3

コンテストのエントリを格納するテーブルがあります。出場者はテキストを入力する必要があり、必要に応じて写真をアップロードできます

ページにエントリを表示するときは、一度に 9 ページめくります。

各ページに写真付きのエントリが少なくとも 1 つ含まれるようにするにはどうすればよいですか (1 ページに 1 枚分の写真エントリがあると仮定して)。写真付きのエントリをページ間で均等に配布するだけで十分でしょう。

4

3 に答える 3

0

これは私が最近見たより挑戦的な質問の1つでした-それをありがとう!単一のSQLステートメントを使用して動作させることはできませんが、このように動作させることはできました(少なくとも表示されます)。基本的に、返される結果の数を決定し、次に写真を持っている結果の数を決定し、写真のパーセンテージをページ数で割った値を使用します(CEILINGを使用して、最初の数ページに少なくとも1つを確保します)。

とにかく、ここに行きます:

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 に答える
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

このクエリは、2 種類の行をユニオンによって再結合された 2 つの個別のクエリに分割します。

于 2013-01-23T00:32:03.510 に答える
0

行をランダムに並べることをお勧めします。

order by rand()

これは、すべてのページに写真が掲載されることを保証するものではありませんが、役に立ちます。

別の方法は、次のようにすることです。

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

次に、seqnum で並べ替えます。これを面倒にしているのは、1 ページに 1 枚未満の写真と 2 枚以上の写真がある場合の処理​​です。おそらくランダムな方法で十分です。

于 2013-01-23T00:24:33.437 に答える