使用Drupal 6,我的目标是订购一组类似于Facebook输出注释的线程注释:在每个线程中使用'anchor'或第一个注释排序DESC,并且任何'内部'线程回复已排序的ASC,以便最新评论在底部。
这是来自comment_render的SQL查询,由COMMENT_ORDER_NEWEST_FIRST排序:
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.signature,
u.picture, u.data, c.thread, c.status
FROM {comments} c INNER JOIN {users} u
ON c.uid = u.uid WHERE c.nid = 141737
AND c.status = 0 ORDER BY c.thread
DESC
这将返回所有注释,首先按最新线程排序:
03/
03.00/
02/
02.06/
02.05/
02.04/
02.03/
02.01/
02.00/
01/
在我的情况下,所需的顺序是:
03/
03.00/
02/
02.00/
02.01/
02.02/
02.03/
02.04/
02.05/
02.06/
01/
再次想到Facebook墙,你就明白了。
任何人都可以帮助适当地增强SQL查询吗?在我的情况下(但可能并非在所有情况下),线程深度通过自定义模块强制限制为1。
另一个注意事项 - 在我的情况下,它只需要在MySQL下工作。
答案 0 :(得分:0)
这个查询有效,但我又是一个SQL菜鸟,所以这可能不完全正确。
选择c.cid作为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.signature, u.picture,u.data,c.thread,c.status FROM(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.signature, u.picture,u.data,c.thread,c.status 来自
comments
c INNER JOINusers
你 ON c.uid = u.uid WHERE c.nid = 141737 AND c.status = 0 ORDER BY SUBSTRING(thread,1,(LENGTH(thread) - 1)))c INNER JOINusers
u ON c.uid = u.uid WHERE c.nid = 141737 AND c.status = 0 ORDER BY SUBSTRING(thread,1,2)DESC
这个想法是首先使用基于完整线程(02.05等)的排序进行查询,然后在线程字段的前两个字符上再做一次SELECT。我可以获得一些优化帮助,还是“正确”?