Mysql 将线程化、反向计时Drupal故事评论转变为Reddit风格的评论

Mysql 将线程化、反向计时Drupal故事评论转变为Reddit风格的评论,mysql,drupal,reddit,drupal-5,Mysql,Drupal,Reddit,Drupal 5,我有一个Drupal站点,它当前以线程化、逆时间顺序显示注释。我正在尝试将其改为像Reddit/Hacker News一样工作,每个线程中的线程和评论根据我添加的投票系统,按当前分数排序 我现在找到了用于呈现注释的查询。据我所知,我需要找到一种方法来为这个查询中的每个注释选择分数数据,然后我需要按照分数的降序对注释进行排序,同时仍将它们保留在线程中 问题是: $query = 'SELECT c.cid as cid, c.pid, c.nid, c.subject, c.comment, c.

我有一个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列与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值,对线程的每个级别中的注释进行排序


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

首先,你不应该对放射性表进行内部连接,这样做你需要有一个匹配,相反,你可以进行左连接或只是连接。我不是SQL专家,所以不确定联接和左联接的确切区别


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

Googletorp关于外部联接是正确的,我认为对于这种情况,left outer是正确的

那么我该如何改变这句话的结尾呢 查询,以便按顺序排列注释 在得分的同时保持他们在正确的范围内 他们的线索

您可以有多个ORDERBY子句。我没有您的模式,因此无法测试,但类似于:

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

我们应该做到这一点

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

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

  • 左连接:包括所有注释
  • 内部连接:仅包含包含放射性数据的注释(更快)
如果您想查看,下面是视图SQL输出:

选择comments.cid作为cid,
放射性能量作为放射性能量,
聚结(放射性注释能量,0)为放射性注释能量排序键,
comments.timestamp作为comments\u timestamp
根据评论
左键连接放射性放射性注释注释注释1注释f ON comments.cid=放射性注释1注释f.id和(放射性注释1注释f.class='comment'和放射性注释1注释f.detaction\u profile=1)
按放射性排序\u注释\u 1\u f\u能量\u排序说明,注释\u时间戳ASC


-1当您通过c.thread进行订购时,您将获得一个绝对订单,导致第二个订单_by子句将无效。第二顺序的条款只有在某些条款与第一条款排名相同时才有效。在这种情况下,这是不可能的。你说的线是绝对的,我的错。但这是可能的。不幸的是,我使用的是Drupal5,所以我不能使用视图来排序我的评论。看起来这个查询也没有考虑注释的线程值。关于左连接和内部连接之间差异的解释应该仍然有效,它来自模块,而不是视图。您可能希望将Drupal-5添加到标记中。