当字段可能为null时,使用具有三个表的连接

时间:2010-03-22 21:56:51

标签: php mysql

以下代码效果很好。它结合了两个MySQL表的数据。我想通过从名为comment的第三个MySQL表中提取一些数据来修改它。

在下面的HTML表格中,title是MySQL表submission中的一个字段。每个title都有一个相应的submissionid字段。字段submissionid也可以在comment MySQL表中找到。

在下面的HTML表格中,我希望countComments等于任何给定commentid的MySQL表comment中出现submissionid字段的次数, submissionidsubmission表中comment相同的位置,以及submissionid对应于所使用的title的位置。

以下是问题:如果MySQL表comment中没有与submissionid table对应的行,我希望countComments等于零。

我该怎么做?

$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>";

3 个答案:

答案 0 :(得分:1)

你正在进行INNER JOIN,但是你需要一个OUTER JOIN,特别是LEFT JOIN。使用LEFT JOIN,“左侧”表始终连接,如果没有对应,则右侧表的字段设置为null。这个差异在wikipedia page中得到了很好的解释。

然后,您必须对具有相同提交ID的行进行分组并计算已分组的行数,请注意,如果一个提交只有一个注释而另一个没有,则它们都有1个分组行...如果一个提交没有评论,在下一个查询中c.submissionid将为null,所以

你的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

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

答案 1 :(得分:0)

如果我理解你的问题,那该怎么办:

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, COUNT(c.id) AS commentCount
FROM submission AS s
LEFT JOIN login AS l ON l.loginid = s.loginid
LEFT JOIN comments AS c ON c.submissionid = s.id
ORDER BY s.datesubmitted DESC
LIMIT 10

答案 2 :(得分:0)

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid, 
       COUNT(c.submissionid) 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.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid
ORDER BY s.datesubmitted DESC
LIMIT 10

SELECT s.loginid, s.title, s.url, s.displayurl, l.username, c.submissionid, 
       (SELECT count(*) FROM submission s WHERE c.submissionid =s.submissionid) AS countComments
FROM submission AS s
INNER JOIN login AS l ON l.loginid = s.loginid
ORDER BY s.datesubmitted DESC
LIMIT 10

如果我没有制作(m)任何拼写错误:)

如果它适合你,我可以提供更多解释。