0

このクエリの結果セットを制限するのに助けが必要です。

SELECT tt.id
FROM kf_topics AS tt
LEFT JOIN kf_posts AS pp
ON tt.id = pp.topicid
WHERE tt.boardid = 1
GROUP BY tt.id
ORDER BY tt.sticky DESC, pp.time DESC

Current は以下の配列を返します。

ここに画像の説明を入力

ただし、指定した ID を持つ行の後にリスト内の行を見つける必要があります。これらは、ORDER BY tt.sticky DESC、pp.time DESC に基づいて ALOT の順序を変更することに注意してください。また、行が完全な ID 順になることはないため、ID フィールドに基づくことは問題外です。

たとえば、ID = 24 の次の行を検索したい場合、クエリ結果は ID => 23 になります。

4

2 に答える 2

3

次のように、単一のクエリを使用してそれを行うことができます

SELECT ttid
FROM 
(SELECT tt.id ttid,@row:=@row+1 rownum,IF(tt.id=24,@j:=@row,0)
FROM kf_topics AS tt
LEFT JOIN kf_posts AS pp
ON tt.id = pp.topicid JOIN (SELECT @row:=0) AS rowcount
WHERE tt.boardid = 1
GROUP BY tt.id
ORDER BY tt.sticky DESC, pp.time DESC) A JOIN (SELECT @j+1 as rownum) B ON (A.rownum=B.rownum);

group by を使用している理由はわかりませんが、いずれにしても機能するはずです。

于 2012-11-23T17:49:28.790 に答える
0
SET @row:=0;
SELECT rownum+1 INTO @nextrow FROM 
   (SELECT tt.id AS id, @row AS rownum
   FROM kf_topics AS tt
   LEFT JOIN kf_posts AS pp
   ON tt.id = pp.topicid
   WHERE tt.boardid = 1
   AND (@row:=@row+1)<=1
   GROUP BY tt.id
   ORDER BY tt.sticky DESC, pp.time DESC) A
WHERE A.id=<id>)
SET @row=0;
SELECT A.id FROM 
  (SELECT tt.id AS id, @row AS rownum
   FROM kf_topics AS tt
   LEFT JOIN kf_posts AS pp
   ON tt.id = pp.topicid
   WHERE tt.boardid = 1
   AND (@row:=@row+1)<=1
   GROUP BY tt.id
   ORDER BY tt.sticky DESC, pp.time DESC) A 
WHERE A.rownum=@nextrow

これは、単一のクエリに書き直すことができます。上記のクエリは最適化されていませんが、必要な結果が得られます。もう一度考えて、最適化されたクエリを投稿しようとします。

于 2012-11-22T05:40:56.397 に答える