添加联接时结果的奇怪顺序

时间:2013-08-28 22:02:11

标签: mysql sql

我正在尝试在我的网站上建立评论系统,但是在正确排序评论方面存在问题。这是我出错之前的截图:

enter image description here

这是在出错之前的查询:

SELECT
    com.comment_id,
    com.parent_id,
    com.is_reply,
    com.user_id,
    com.comment,
    com.posted,
    usr.username
FROM
    blog_comments AS com
LEFT JOIN
    users AS usr ON com.user_id = usr.user_id
WHERE
    com.article_id = :article_id AND com.moderated = 1 AND com.status = 1
ORDER BY
    com.parent_id DESC;

我现在想要使用LEFT OUTER JOIN从我的blog_comment_votes表中包含每个评论的投票,然后提出这个查询,它可以运行,但是按结果的顺序搞定:

SELECT
    com.comment_id,
    com.parent_id,
    com.is_reply,
    com.user_id,
    com.comment,
    com.posted,
    usr.username,
    IFNULL(c.cnt,0) votes
FROM
    blog_comments AS com
LEFT JOIN
    users AS usr ON com.user_id = usr.user_id
LEFT OUTER JOIN (
    SELECT comment_id, COUNT(vote_id) as cnt
    FROM blog_comment_votes
    GROUP BY comment_id) c
    ON com.comment_id = c.comment_id
WHERE
    com.article_id = :article_id AND com.moderated = 1 AND com.status = 1
ORDER BY
    com.parent_id DESC;

我现在得到这个命令,这很奇怪:

enter image description here

我尝试在com.comment_id上添加GROUP BY子句,但也失败了。我无法理解添加简单连接如何改变结果的顺序!任何人都可以帮助回到正确的道路上吗?

示例表数据和预期结果

这些是我的相关表格,包含示例数据:

[用户]

user_id | username
--------|-----------------
1       | PaparazzoKid

[blog_comments]

comment_id | parent_id | is_reply | article_id | user_id |  comment      
-----------|-----------|----------|------------|---------|---------------------------
1          | 1         |          | 1          | 1       |  First comment
2          | 2         | 1        | 1          | 20      |  Reply to first comment
3          | 3         |          | 1          | 391     |  Second comment

[blog_comment_votes]

vote_id | comment_id | article_id | user_id
--------|------------|------------|--------------
1       | 2          | 1          | 233
2       | 2          | 1          | 122

所以顺序应该是

First comment
    Reply to first comment    +2
Second Comment

1 个答案:

答案 0 :(得分:1)

如果不查看您的查询结果很难说,但我的猜测是因为您只按父ID排序,而不是说当两个记录具有相同的父ID时如何排序。尝试将查询更改为:

SELECT
    com.comment_id,
    com.parent_id,
    com.is_reply,
    com.user_id,
    com.comment,
    com.posted,
    usr.username,
    COUNT(c.votes) votes
FROM
    blog_comments AS com
LEFT JOIN
    users AS usr ON com.user_id = usr.user_id
LEFT JOIN 
    blog_comment_votes c ON com.comment_id = c.comment_id
WHERE
    com.article_id = :article_id AND com.moderated = 1 AND com.status = 1
GROUP BY 
    com.comment_id,
    com.parent_id,
    com.is_reply,
    com.user_id,
    com.comment,
    com.posted,
    usr.username
ORDER BY
    com.parent_id DESC, com.comment_id;