3

サブジェクトを含む 1 つのテーブル、ユーザー データ用の 1 つのテーブル、およびユーザー サブスクリプションを格納するための 1 つのテーブルの 3 つのテーブルがあります。

ユーザーはオプションでサブスクライブされる場合とされない場合があるため、すべてのユーザー リストとそのサブスクリプション ステータスを取得するには、左結合を次のように使用します。

SET @rnum = 0;

SELECT (@rnum :=@rnum + 1) AS rn, user.user_name, subs.status 
FROM user_tbl LEFT JOIN subs_tbl ON user.uid = subs.uid LIMIT 0, 10;

一度にこの出力全体を使用していましたが、データが大きくなったため、この出力のページングをアプリケーションに実装しました。

ページングのために、row_num メカニズムを作成しました。最後に表示された row_num を保存し、次のページでは last_num から表示します。

今、最初または最後に購読したユーザーを並べ替えたいので、使用しました

SELECT (@rnum :=@rnum + 1) AS rn, user.user_name, subs.status
FROM user_tbl LEFT JOIN subs_tbl ON user.uid = subs.uid ORDER BY subs.status LIMIT 0, 10;

これは行番号を提供していますが、私が望んでいたものではありません。最初に行番号を提供してからソートを行うため、希望どおりの結果が得られません。

だから私はフォローするのに助けが必要です、

  1. ページングのより良い方法はありますか?
  2. Left Join の代用はありますか (すべてのユーザー情報が必要なため、null 値も必要です)。
  3. SQL結果に番号を付ける他の方法はありますか。
  4. 関数に関する PHP や、この場合に役立つものはありますか。

[これは私の実際の問題から作成されたサンプルです。私の実際の問題では、複数の結合とサブクエリを含む巨大なクエリがあるため、このクエリのネストと番号付けは不可能です]

4

1 に答える 1

2

おそらく、あなたはこのようなものを探しています:

(コメントで思い出したように、OPの要件を満たしていないとして削除されました。)

または、 のパラメーター化を試すこともできますLIMIT。MySQL 5.0.7 の時点で、ストアド プロシージャまたはプリペアド ステートメントの一部であるステートメントで使用される場合、LIMITパラメーター化可能です。

PREPARE stmt FROM
'SELECT
...
LIMIT ?, ?';

EXECUTE stmt USING @offset, @limit;

この方法では、できるだけ明確な並べ替え順序を使用することが最も理にかなっていることに注意してください。

于 2013-07-31T08:58:04.943 に答える