3

プライマリ メッセージとサブメッセージを含むことができるメッセージ テーブルがあります。私が達成したいのは、上位2つの最新のサブメッセージのみを取得することです。

SELECT message.id, message.date_sent,message.object_id, message.content, 
       SubMessage1.content, SubMessage1.id, SubMessage1.date_sent,
       SubMessage2.content, SubMessage2.id, SubMessage2.date_sent
  FROM messages As Message 
  LEFT
 OUTER
  JOIN ( SELECT messages.object_id as object_id, messages.content as content,
                messages.id as id , messages.date_sent as date_sent
           FROM messages
          ORDER
             BY messages.date_sent ASC LIMIT 1,1
       ) as SubMessage1
    ON Message.id = SubMessage1.object_id
  LEFT
 OUTER
  JOIN ( SELECT messages.object_id as object_id, messages.content as content,
                messages.id as id , messages.date_sent as date_sent
           FROM messages
          ORDER
             BY messages.date_sent ASC LIMIT 2,1
       ) as SubMessage2
    ON Message.id = SubMessage2.object_id
 WHERE Message.id = 1

制限を削除すると、常に最初の結果が得られます。しかし、制限を入れると、null 値が得られます。何か案は?提案?

4

4 に答える 4

1

ここでの問題はORDER BY ... LIMIT ...、サブクエリのin が結合の前に適用されていることです。ON Message.id = ... .object_idその結果、結合は1 つのメッセージを調べて、それがサブメッセージかどうかを判断する機会しかありません。ほとんどの場合、そうではないので、NULL値を取得します。

ONこれを修正するには、 -clausesの内容をサブクエリ内の -clauses に移動する必要がありますWHERE。通常、これは少し混乱しますが、単一レコードの結果セットを取得するだけなので、それほど悪くはありません。

SELECT message.id, message.date_sent, message.object_id, message.content, 
       SubMessage1.content, SubMessage1.id, SubMessage1.date_sent,
       SubMessage2.content, SubMessage2.id, SubMessage2.date_sent
  FROM messages AS Message 
  LEFT
 OUTER
  JOIN ( SELECT messages.object_id AS object_id, messages.content AS content,
                messages.id AS id, messages.date_sent AS date_sent
           FROM messages
          WHERE messages.object_id = 1
          ORDER
             BY messages.date_sent ASC LIMIT 1,1
       ) AS SubMessage1
    ON TRUE
  LEFT
 OUTER
  JOIN ( SELECT messages.object_id AS object_id, messages.content AS content,
                messages.id AS id, messages.date_sent AS date_sent
           FROM messages
          WHERE messages.object_id = 1
          ORDER
             BY messages.date_sent ASC LIMIT 2,1
       ) AS SubMessage2
    ON TRUE
 WHERE Message.id = 1
;

(これには、クエリにパラメーターが 3 回含まれていることに注意してください。理想的とは言えませんが、実際には問題にはなりません。)

于 2012-11-29T22:41:50.613 に答える
1
SELECT * FROM messages WHERE id = 1
Union all
SELECT * FROM messages WHERE object_id=1
ORDER BY date_sent ASC LIMIT 2
于 2012-11-29T22:26:48.687 に答える
0

2行が必要な場合は、使用します

LIMIT 2

SQL ランドでは、カウントは 0 ではなく 1 から始まります。

また、2つのパラメータを持つmysql LIMITは次のとおりです。

LIMIT offset, row_count

しかし、1つのパラメータでは次のようになります:

LIMIT row_count

パラメータをそのように動かし、彼のズボンを蹴ることを決めた天才に会いたい.

于 2012-11-29T22:24:44.290 に答える
-1

LIMIT コマンドの開始インデックスは 0 です。制限を (0, 1) および (1, 1) に変更することをお勧めします。

于 2012-11-29T22:36:30.850 に答える