帮助这个JOIN

时间:2009-08-07 17:40:36

标签: php sql mysql join

$threads = mysql_query("SELECT DISTINCT t.id, t.title
                        FROM threads t LEFT JOIN comments c ON t.id = c.parentID
                        ORDER BY c.date DESC");

while ($thread = mysql_fetch_assoc($threads)) {

 echo "<li><a href=\"?threadID=$thread[id]\">".htmlspecialchars($thread['title'])."</a></li>\n";

}

任何人都可以在此代码中看到问题吗?它不会像我想要的那样工作。我希望它是最新评论的线程,以及下一个最新的等等。

echo $ thread [parentID]没有回应

注释:
id,comment,parentID,date

5 个答案:

答案 0 :(得分:2)

您按照DISTINCT列表中的列进行排序。

这是MySQL中的有效语法,但此ORDER BY毫无意义。

此语法为MySQL extension,此查询将在四大的任何其他RDBMS引擎中失败。

DISTINCTGROUP BYcolumn的相同值始终对应相同值的情况下,它用于简化SELECTORDER BY个查询GROUP BYDISTINCT中的列。

如果您的情况如此,c.date的每个值都可以有t.id的多个值,而c.date选择的ORDER BY值远远不是SELECT t.id, t.title, ( SELECT c.date FROM comments c WHERE c.parent_id = t.id ORDER BY c.date DESC LIMIT 1 ) lastcomment FROM threads t ORDER BY ISNULL(lastcomment), lastcomment 保证(它可以是最后一个值,第一个值或任何其他值)。

重写您的查询:

{{1}}

答案 1 :(得分:0)

尝试在MySQL Query浏览器中运行数据查询,看看是否返回任何结果。如果是,那么问题在于您的回声,而不是您的查询。

答案 2 :(得分:0)

我有一段时间没有使用MySQL,所以我知道这在tSQL中有用。你可以尝试:

SELECT DISTINCT t.id, t.title
FROM threads t LEFT JOIN comments c ON t.id = c.parentID AND 
c.id = (SELECT MAX(c.id) FROM comments where comments.parentID = t.id)
ORDER BY c.date DESC

评论中有很多行,这很容易变慢。如果您发现性能问题,可以将最后一个注释日期存储在线程中。

答案 3 :(得分:0)

我尝试了这个,它听起来像你想要的那样

SELECT DISTINCT t.id, t.title FROM threads AS t LEFT JOIN comments AS c ON t.id = c.parent_id ORDER BY c.date DESC

我改变的唯一真实就是使用

FROM threads AS T

答案 4 :(得分:-1)

我不确定您要实现的目标,但如果您想回显parentID,则需要将其包含在查询中。

$threads = mysql_query("SELECT DISTINCT t.id, t.title, c.parentID
                        FROM threads t LEFT JOIN comments c ON t.id = c.parentID
                        ORDER BY c.date DESC");