0

親と子を持つsubmissions_commentsテーブルがあり、各子には1:1の関係があり、各parnetには1:多の関係があります。

つまり、すべての親は無制限 (1 レベルの子) を持つことができ、すべての子は 1 つの親のみを持つことができます。

現在のクエリは、特定の送信に対するすべてのコメントを返し、アプリケーションのフロントエンドでネストできるため、正常に動作しますが、ajax ページネーションのオフセットを導入すると、親のみを取得しますそれがオフセットにあり、その特定のオフセットで返されない子コメントが含まれている場合、ネストは機能しません。

オフセット (0,15 15,30 など) を使用して、関連するすべての子コメントを取得するようにクエリを変更するにはどうすればよいですか?

    SELECT parent.id,
      parent.deleted,
      parent.comment,
      parent.user_id,
      parent.created,
      parent.parent_id,
      s.user_id submissionUserId,
      u.username,
      u.photo AS userPhoto
    FROM submissions_comments AS parent
    LEFT JOIN users u ON parent.user_id = u.id
    LEFT JOIN submissions_comments AS child ON child.parent_id = parent.id
    LEFT JOIN submissions s ON parent.submission_id = s.id
    WHERE parent.submission_id = ?
    AND parent.deleted = 0
    GROUP BY parent.id
    ORDER BY parent.created DESC,
    child.created
    LIMIT 0,15 // or offset that I pass in from my front-end application.

データ/テーブルの sqlfiddle は次のとおりです。

http://sqlfiddle.com/#!2/924c8

また、これは順不同のデータの例です (たとえば、id= 5 のコメントは、(最初ではなく) 2 番目の結果セットにある必要があります)。

最初に 0.15 のオフセットを使用します (これは、ページに表示されるデフォルトのコメントの数です):

+-----+---------+-----------------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
| id  | deleted | comment               | user_id | created             | parent_id | submissionUserId | username | userPhoto                            |
+-----+---------+-----------------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
| 21 |       0 | Replying to comment 5 |      2 | 2014-08-08 01:14:42 |       5 |               58 | bobcobb2     | 772187eabd2df8ce62a2f1d59f61eb21.jpg |
| 20 |       0 | .... comment 20       |      1 | 2014-08-08 01:13:31 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 19 |       0 | .... comment 19       |      1 | 2014-08-08 01:13:29 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 18 |       0 | .... comment 18       |      1 | 2014-08-08 01:13:26 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 17 |       0 | .... comment 17       |      1 | 2014-08-08 01:13:23 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 16 |       0 | .... comment 16       |      1 | 2014-08-08 01:13:18 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 15 |       0 | .... comment 15       |      1 | 2014-08-08 01:13:16 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 14 |       0 | .... comment 14       |      1 | 2014-08-08 01:13:13 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 13 |       0 | .... comment 13       |      1 | 2014-08-08 01:13:11 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 12 |       0 | .... comment 12       |      1 | 2014-08-08 01:13:06 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 11 |       0 | .... comment 11       |      1 | 2014-08-08 01:13:05 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 10 |       0 | .... comment 10       |      1 | 2014-08-08 01:13:04 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 9 |       0 | .... comment 9        |      1 | 2014-08-08 01:13:02 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 8 |       0 | .... comment 8        |      1 | 2014-08-08 01:13:00 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 7 |       0 | .... comment 7        |      1 | 2014-08-08 01:12:57 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
+-----+---------+-----------------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+

次に、ページの [その他のコメントを読み込む...] リンクをクリックして (古い) コメントを取得するときに、オフセット 15,30 を渡します。

+-----+---------+----------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
| id  | deleted | comment        | user_id | created             | parent_id | submissionUserId | username | userPhoto                            |
+-----+---------+----------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
| 6 |       0 | .... comment 6 |      1 | 2014-08-08 01:12:54 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 5 |       0 | .... comment 5 |      1 | 2014-08-08 01:12:51 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 4 |       0 | .... comment 4 |      1 | 2014-08-08 01:12:50 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 3 |       0 | .... comment 3 |      1 | 2014-08-08 01:12:48 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 2 |       0 | .... comment 2 |      1 | 2014-08-08 01:12:47 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
| 1 |       0 | .... comment 1 |      1 | 2014-08-08 01:12:41 |      NULL |               58 | bobcobb    | 935dc24b4529374bc1efcb782411f50e.png |
+-----+---------+----------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
4

1 に答える 1

0

問題についての私の理解は、コメントの 1 つが順不同で返されるということです。現在、クエリは作成日の降順ですべてのコメントを並べ替えています。あるコメントが別のコメントへの返信である場合を除いて、これは一般的に正しいです。次に、「子」コメントを親コメントと同時に返す必要があります。この順序付けを実現するクエリを次に示します。

SELECT parent.id,
  parent.deleted,
  parent.comment,
  parent.user_id,
  parent.created,
  parent.parent_id,
  s.id as sid,
  s.user_id submissionUserId,
  u.username,
  u.photo AS userPhoto
FROM submissions_comments AS parent
LEFT JOIN users u ON parent.user_id = u.id
LEFT JOIN submissions s ON parent.submission_id = s.id
WHERE parent.submission_id = ?
AND parent.deleted = 0
GROUP BY parent.id
ORDER BY Case when parent.parent_id is null Then
          parent.created
         Else (Select p.created
               From submissions_comments p
               Where p.id = parent.parent_id) End DESC,
parent.id
LIMIT 15,30

元のクエリに対する変更は次のとおりです。

  • 1) submits_comments テーブルへの左結合が削除されました。テーブルは order by でのみ使用されていたため、この結合を削除しました。order by 句で同じテーブルを使用しましたが、自己結合が少ないほど優れています。
  • 2) 今までの注文には case ステートメントが含まれています。

レコードにparent_idがある場合、結果の順序付け方法を完全に変更する必要があるため、order byにはcaseステートメントが必要です。parent_id が null の場合、case ステートメントは作成日を返します。parent_id が null でない場合、case ステートメントは親の作成日を返します。これにより、子コメントが親コメントのすぐ隣に並べ替えられます。

次に、親 ID が最初になるように ID で並べ替えました。これはあなたが望むものではないかもしれません.代わりにparent.created descで注文して、すべての子コメントが親コメントの前に返されるようにすることができます. 提供されたSQLフィドルを使用すると、次のようになります。

結果の例 (すべての列が含まれているわけではありません):

|id|deleted|user_id| created             | parent_id |submissionUserId| username |
+-----+---------+----------------+---------+---------------------+-----------+------------------+----------+--------------------------------------+
| 6|     0 |     1 | 2014-08-08 01:12:54 |      NULL |             58 | bobcobb |
| 5|     0 |     1 | 2014-08-08 01:12:51 |      NULL |             58 | bobcobb |
|21|     0 |     2 | 2014-08-08 01:14:42 |         5 |             58 | bobcobb2|
| 4|     0 |     1 | 2014-08-08 01:12:50 |      NULL |             58 | bobcobb |
| 3|     0 |     1 | 2014-08-08 01:12:48 |      NULL |             58 | bobcobb |

このクエリの唯一の問題は、制限が他のすべてに優先することです。親が行 15 にリストされ、子が行 16 にリストされている場合、これらの結果は一緒に返されません。制限は行 15 で停止します。

私が言及したい唯一の他のことは、mysql がLIMIT句にパラメータを渡すことを許可しないということです。パラメーターとして返される範囲を渡すことを計画している場合は、クエリのこの部分を再考する必要がある場合があります。考えられる解決策の 1 つは、一時テーブルを作成し、(結果の順序に基づいて) 一時 ID を割り当て、探している範囲内の一時 ID を持つ結果のみを返すことです。

于 2014-08-11T21:24:03.810 に答える