下面的代码工作得很好。它结合了来自两个MySQL表的数据。我想通过从第三个名为comment的MySQL表中提取一些数据来修改它。
在下面的HTML表中,title是MySQL表中的一个字段。每个submission都有相应的title字段。字段submissionid也可以在MySQL表中找到。
在下面的HTML表中,我希望submissionid等于任何给定comment的MySQL表中出现名为countComments的字段的次数,其中commentidcommentsubmissionid表中都是相同的,submissionid对应于使用的submission
这里有一个问题:如果MySQL表中没有对应于用于commentsubmissionid的行,我希望title等于零。
我该怎么做?

$sqlStr = "SELECT s.loginid, s.title, s.url, s.displayurl, l.username
             FROM submission AS s,
                  login AS l
            WHERE s.loginid = l.loginid
         ORDER BY s.datesubmitted DESC
            LIMIT 10";


$result = mysql_query($sqlStr);

$arr = array();
echo "<table class=\"samplesrec\">";
while ($row = mysql_fetch_array($result)) {
    echo '<tr>';
    echo '<td class="sitename1"><a href="http://www.'.$row["url"].'">'.$row["title"].'</a></td>';
    echo '</tr>';
    echo '<tr>';
    echo '<td class="sitename2"><a href="http://www...com/sandbox/members/index.php?profile='.$row["username"].'">'.$row["username"].'</a><a href="http://www...com/sandbox/comments/index.php?submission='.$row["title"].'">'.$row["countComments"].'</a></td>';
    echo '</tr>';
    }
echo "</table>";

最佳答案

您正在进行内部联接,但您需要外部联接,特别是左联接。使用左联接时,表“on the LEFT”始终联接,如果没有对应关系,则右侧表的字段设置为空。这个wikipedia page很好地解释了这种差异。
然后,您必须使用相同的提交id对行进行分组,并计算分组的行数,注意如果一个提交只有一个注释,而另一个没有注释,则它们都有一个分组行。。。如果一个提交没有注释,那么在下一个查询中c.submissionid将为空,因此
你的SQL可能是

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid,
IF(c.submissionid IS NULL, 0, COUNT(*))  AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
GROUP BY (s.id)
ORDER BY s.datesubmitted DESC
LIMIT 10

可能有错误,我没有测试查询。。。但我希望给你一个正确的想法,那就是外部连接和内部连接的区别。

09-03 23:40