1

この種のクエリから効率的に結果を取得するための最良の方法を見つけるためにいくつかの助けが必要です。私はメッセージの表を持っており、このメッセージの表にはそれぞれのコメントがあります。各メッセージとそのメッセージの後続の各コメントを取得する必要があります。最初はすべてのメッセージとそのPKを取得することを考えていましたが、ループ内でこれを使用してコメントを取得しましたが、より効率的な方法があるかどうか疑問に思っています。各メッセージを、そのメッセージに対する後続のすべてのコメントと一緒に表示したいと思います。メッセージ1->すべてのコメントメッセージ2->すべてのコメント。これは、出力を次のようにしたかった例です。

eg.    Work Site Maintenance.  //Message
               At 1pm          //comments
               At 2pm          //comments
               At 3pm          //comments
         Work Site Offline.
               Foundation work
               Layng blocks
               Placing steel

メッセージのリストを取得するが、それぞれのコメントは取得しない現在のクエリ

SELECT MS.status_id,
       MS.member_id,
       MS.status_text,
      MS.status_time
    FROM message_status MS
    WHERE MS.member_id = memberId //variable
    ORDER BY MS.status_id DESC 
    LIMIT 20


**message_status**
status_id PK
member_id
status_text
status_time

**comments_status**
status_id FK
member_id FK
comm_text
comm_time
4

3 に答える 3

2

参加するだけで、思い通りの結果が得られると思います。

SELECT MS.status_id,
   MS.member_id,
   MS.status_text,
   MS.status_time,
   CS.comm_text,
   CS.comm_time
FROM message_status MS
  left join comments_status CS on CS.status_id = MS.status_id
WHERE MS.member_id = memberId //variable
ORDER BY MS.status_id DESC, CS.comm_time DESC
LIMIT 20
于 2013-02-16T13:34:53.423 に答える
1

LEFT JOINを使ってみませんか:

SELECT MS.status_id,
       MS.member_id,
       MS.status_text,
       CS.comm_text,
      MS.status_time
    FROM message_status MS
    LEFT JOIN (SELECT * FROM comments_status) AS CS
    USING (status_id,member_id)
    WHERE MS.member_id = memberId //variable
    ORDER BY MS.status_id DESC 
    LIMIT 20;

また、WHERE句とJOIN句の列にインデックスを付けると、SELECTクエリが高速化されます(ただし、INSERTは低速になるため、このクエリを頻繁に実行する場合にのみトレードオフの価値があります)。

CREATE INDEX m_id ON message_status (member_id);
CREATE INDEX sm_id ON message_status (status_id,member_id);
CREATE INDEX sm_id ON comments_status (status_id,member_id);

例:http ://sqlfiddle.com/#!2 / 565f9 / 1

于 2013-02-16T14:01:56.040 に答える
0

最適な選択は、結合を使用して1回のラウンドトリップですべてのデータを取得することと、少量のデータへのラウンドトリップのオーバーヘッドを何度も取得することです。

使用状況がない場合は、どちらの方法でもこれを議論できます。

見るべきものは、です。

常にすべてのデータを取得しますか?

次にやりたいことをする前に、すべてのデータが必要ですか。

往復の費用はいくらですか?

それをすべて手に入れるための費用はいくらですか?

一度取得するとデータをキャッシュします(たとえば、遅延読み込みが便利です)。データがどれほど揮発性であるかを推測する必要があります。キャッシュが古くなっている可能性はどのくらいありますか。一度にすべてのデータを取得することは大きなキャッシュであることを忘れないでください。

UIの応答性を非効率にすることを選択する可能性はあります。コンボに顧客名を入力し、選択時にそのプロパティを表示することを検討してください。しかし、もしウェブページだったら、ajaxのようなものでさえ往復するのは苦痛かもしれません。

要するに、何で効率的ですか?

于 2013-02-16T13:58:02.170 に答える