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';

我需要加入的表叫做radiactivity,看起来像这样

@放射性

班级 | 编号 | 活力

评论 | 1 | 5 条
评论 | 2 | 8
条评论 | 3 | 27
条评论 | 4 | 13

此表中的 id 列与 comments 表中的 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

首先,您不应该对放射性表进行内部连接,这样做需要匹配,而是可以进行左连接或仅连接。我不是 SQL 专家,所以不确定联接和左联接之间的区别究竟是什么。

关于排序,我认为不可能保留线程并根据他们的能量对它们进行排序。不是在 SQL 中。我将把评论作为线程化,在某个地方我确信它们将转换为包含树结构的数组。我会使用该数组作为排序的基础,因为您可以很容易地根据您想要的任何排序标准重新排列不同的分支。

于 2009-09-22T07:28:43.327 回答
0

我一直对放射性很好奇,所以我看了看这个。

在视图中,放射性排序处理程序提供以下指导:

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

如果您想查看它,这里是 Views 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 回答
-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 回答