将线程,反向计时Drupal故事评论转换为Reddit风格的评论

时间:2009-09-22 07:09:55

标签: mysql drupal reddit drupal-5

我有一个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';

我需要加入的表称为放射性,看起来像这样

@radioactivity

类| id |能量

评论| 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排序。如果一个线程是这样的结构:

评论
-comment
--comment
--comment
-comment
-comment

c.thread值为

1
1.1
1.1.1
1.1.2
1.2
1.3

我想保留这个结构,但是根据当前得分而不是c.thread值,在一个线程的每个级别内都有注释。

我知道这很多而且非常详细,但我认为这是最好的场地。

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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

答案 2 :(得分:-1)

Googletorp关于外部连接是正确的,我认为左外部对于这种情况是正确的。

  

然后我如何改变结束   查询按顺序排列注释   得分,同时仍然保持他们   他们的线程?

你可以有多个by 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

应该做的伎俩。

相关问题