【问题标题】:Turning threaded, reverse chrono Drupal story comments into Reddit-style comments将线程化的、反向计时的 Drupal 故事评论变成 Reddit 风格的评论
【发布时间】:2010-11-30 07:43:18
【问题描述】:

我有一个 Drupal 站点,该站点当前以线程、反向时间顺序显示 cmets。我正在尝试将其更改为像 Reddit/Hacker News 一样工作,其中每个线程中的线程和 cmets 根据我添加的投票系统按当前分数排序。

我现在找到了用于呈现 cmets 的查询。据我了解,我需要找到一种方法来为此查询中的每个评论选择分数数据,然后我需要按分数的降序对 cme​​ts 进行排序,同时仍将它们保留在线程中。

这是查询:

$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,看起来像这样

@radioactivity

类 |编号 |能源

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

此表中的 id 列与 cmets 表中的 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";

此查询仅返回在放射性表中有条目的 cmets。没有获得任何选票的 cmets 根本不会出现在表格中,因此它们没有被抓住。如何更改它以获取所有 cmets?

然后如何更改查询的结尾,以便它按分数对 cme​​ts 进行排序,同时仍将它们保留在线程中?

现在 cmets 是基于 c.thread 排序的。如果线程是这样的结构:

评论
-评论
--评论
--评论
-评论
-评论

c.thread 值为

1
1.1
1.1.1
1.1.2
1.2
1.3

我想保留这个结构,但是根据他们当前的分数而不是他们的 c.thread 值对线程的每个级别内的 cmets 进行排序。

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

【问题讨论】:

    标签: mysql drupal reddit drupal-5


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      • 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

      【讨论】:

      • 不幸的是,我使用的是 Drupal 5,所以我不能使用视图来订购我的 cmets。看起来这个查询也没有考虑评论的线程值。
      • 关于LEFT JOIN和INNER JOIN区别的解释应该还是有效的,它来自Radioactivity模块,而不是Views。您可能希望将 Drupal-5 添加到您的标签中。
      【解决方案3】:

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

      然后我该如何改变结尾 查询,因此它对 cme​​ts 进行排序 得分,同时仍然保持在范围内 他们的线程?

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

      应该做的伎俩。

      【讨论】:

      • -1 当您通过 c.thread 订购时,您会得到绝对顺序,导致第二个 order_by 子句将无用。 2nd order 子句只有在第一个子句的排名相同的情况下才有效。在这种情况下,这是不可能的。
      • 你是对的,线程是绝对的,我的错。但这是可能的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2018-09-22
      • 2020-04-25
      • 2014-07-01
      相关资源
      最近更新 更多