0

ランクでソートする必要がある記事のページ分割されたリストがありますが、記事の位置が <> 0 の場合、その特定の位置に挿入する必要があります。少なくとも、現在のページの正しい位置を抽出した記事を取得し、それらを PHP で並べ替えて、適切な位置に表示できると考えました。これを MySQL で 1 つのクエリだけで実行したい

私の試みのいくつかは次のとおりです。

このクエリは、最初に現在のページの正しい位置にある記事を選択し、次にランクが最も高い記事を選択しようとします。

SELECT id, rank_score, position
FROM Articles
ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC
LIMIT 0, 50

50 はページに表示される記事の数、1 は現在のページ番号であり、クエリの生成時に追加されます。

このクエリには、ページ 2 の結果が間違っているという問題があります。これは、LIMIT 50,50 を追加することで、そのページに掲載されている記事を超えてしまう可能性があるためです。

別の試み:

SELECT (
    SELECT id, rank_score, position
      FROM Articles
  ORDER BY ((position <= (50 * 1)) AND (position > 50 * (1-1))) DESC, rank_score DESC  
     LIMIT 50)
UNION (
  SELECT id, rank_score, position
    FROM Articles
 ORDER BY rank_score DESC LIMIT x)

2 番目のクエリが正しく機能するには、最初のクエリから返される行数と同じ制限が必要です。さらに、2 番目のクエリでは位置が無視されるため、ランクが非常に高いだけでなく、位置も非常に高い記事は常に早く表示されます。

4

4 に答える 4

1

ええ、魔法のユニコーンは正しいです、そのクエリは間違っています ここに本当の魔法のクエリがあります

SELECT * FROM (
SELECT @rownum:=@rownum+1 rownum, IF(position=0,@rownum,position) as loc, a.id, a.rank_score, a.position
FROM (SELECT @rownum:=0) r, Articles a
ORDER BY rank_score DESC) t 
ORDER BY loc DESC
LIMIT 0, 50
于 2009-12-22T11:37:15.767 に答える
0

質問に対する答えを見つけました。私はSQL + phpソートソリューションをあきらめ、利用可能なランクと位置でソートされたすべての記事を取得する完全なSQLソリューションを見つけました.

SELECT @rownum:=@rownum+1 rownum, IF(position=0,@rownum,position) as loc, a.id, a.rank_score, a.position
FROM (SELECT @rownum:=0) r, Articles a
ORDER BY  loc, rank_score DESC
LIMIT 0, 50
于 2009-12-22T09:39:01.350 に答える
0

魔法のユニコーンが最後のクエリで見ることができるマイナーな観察の 1 つ - ソートされたセットに基づく値を持つことが期待される別のフィールド (@rownum) に基づくフィールド (loc) で結果セットを並べ替えています。神秘的な?循環依存?それとも単に奇妙ですか?;-)

于 2009-12-22T10:17:31.740 に答える