0

現在、スレッド化された時系列の逆順でコメントを表示する Drupal サイトがあります。Reddit/Hacker News のように機能するように変更しようとしています。各スレッド内のスレッドとコメントは、追加した投票システムに基づいて現在のスコア順に並べ替えられます。

コメントをレンダリングするために使用されるクエリを今すぐ見つけました。私が理解しているように、このクエリの各コメントのスコア データも選択する方法を見つける必要があります。次に、コメントをスレッドに保持したまま、スコアの降順で並べ替える必要があります。

クエリは次のとおりです。

$query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.picture, u.data, c.score, c.users, c.thread, c.status FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid WHERE c.nid = %d  ORDER BY c.thread DESC';

参加する必要があるテーブルは放射能と呼ばれ、次のようになります

@放射能

クラス | ID | エネルギー

コメント | 1 | 5
コメント | 2 | 8
コメント | 3 | 27
コメント | 4 | 13

このテーブルの id 列は、コメント テーブルの cid 列と同期します。

スコアリングデータを取り込むためにこれを試しました:

$query = "SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.format, c.timestamp, c.name, c.mail, c.homepage, u.uid, u.name AS registered_name, u.picture, u.data, c.score, c.users, c.thread, c.status, r.energy, r.id, r.class FROM {comments} c INNER JOIN {users} u ON c.uid = u.uid INNER JOIN {radioactivity} r ON c.cid = r.id WHERE c.nid = %d AND r.class = 'comment' ORDER BY c.thread DESC";

このクエリは、放射能テーブルにエントリがあるコメントのみを返します。投票を受けていないコメントはテーブルにまったく表示されないため、取得されません。これを変更して、すべてのコメントを取得するにはどうすればよいですか?

次に、クエリの最後を変更して、スレッド内にコメントを保持したまま、コメントをスコア順に並べ替えるにはどうすればよいでしょうか?

現在、コメントは c.thread に基づいてソートされています。スレッドが次のような構造の場合:

コメント-
コメント
--コメント --コメント
-
コメント-
コメント

c.thread の値は次のようになります。

1
1.1
1.1.1
1.1.2
1.2
1.3

この構造を維持したいのですが、スレッドの各レベル内のコメントは、c.thread の値ではなく、現在のスコアに基づいて並べ替えます。

これはたくさんあり、非常に詳細であることは知っていますが、これが最高の会場だと思いました.

4

3 に答える 3

0

放射能が気になったので調べてみました。

ビューでは、Radioactivity Sort ハンドラーが次のガイダンスを提供します。

  • LEFT JOIN: Include all comments
  • INNER JOIN: Include only comments that have radioactivity data (faster)

ご覧になりたい場合は、ビューの SQL 出力を次に示します。

SELECT comments.cid AS cid, radioactivity_comment_1_f.energy AS radioactivity_comment_1_f_energy, COALESCE(radioactivity_comment_1_f.energy,0) AS radioactivity_comment_1_f_energy_sortkey, comments.timestamp AS comments_timestamp FROM comments comments LEFT JOIN radioactivity radioactivity_comment_1_f ON comments.cid = radioactivity_comment_1_f.id AND (radioactivity_comment_1_f.class = 'comment' AND radioactivity_comment_1_f.decay_profile = 1) ORDER BY radioactivity_comment_1_f_energy_sortkey DESC, comments_timestamp ASC

于 2009-09-22T18:20:22.930 に答える
0

まず、放射性テーブルに内部結合を作成しないでください。一致する必要がある場合は、左結合または結合のみを実行できます。私は SQL の専門家ではないので、結合と左結合の違いが正確にはわかりません。

順番については、スレッドを維持してエネルギーに基づいて並べることは不可能だと思います。それはSQLではありません。スレッド化されたコメントを取得するには、どこかで、ツリー構造を含む配列へのコンバーターになると確信しています。必要な並べ替え基準に基づいてさまざまなブランチを簡単に再配置できるため、その配列を順序付けの基礎として使用します。

于 2009-09-22T07:28:43.327 に答える
-1

外部結合については Googletorp が正しいですが、この場合は左外部結合が正しいと思います。

次に、クエリの最後を変更して、スレッド内にコメントを保持したまま、コメントをスコア順に並べ替えるにはどうすればよいでしょうか?

複数の order by 句を使用できます。私はあなたのスキーマを持っていないので、テストすることはできませんが、次のようなものです:

SELECT c.cid as cid,
       c.pid, c.nid,
       c.subject,
       c.comment,
       c.format,
       c.timestamp,
       c.name,
       c.mail,
       c.homepage,
       u.uid,
       u.name AS registered_name,
       u.picture,
       u.data,
       c.score,
       c.users,
       c.thread,
       c.status,
       COALESCE (r.energy,0) as energy
FROM {comments} c
INNER JOIN {users} u ON c.uid = u.uid 
LEFT OUTER JOIN {radioactivity} r ON (c.cid = r.id AND r.class = 'comment')
WHERE c.nid = %d 
ORDER BY c.thread DESC, energy DESC

トリックを行う必要があります。

于 2009-09-22T09:39:11.847 に答える