Php 当字段可能为空时,使用三个表的联接

Php 当字段可能为空时,使用三个表的联接,php,mysql,Php,Mysql,下面的代码非常有效。它组合了来自两个MySQL表的数据。我想通过从第三个MySQL表comment中提取一些数据来修改它 在下面的HTML表格中,title是MySQL表格submission中的一个字段。每个标题都有一个相应的submissionid字段。字段submissionid也可以在commentMySQL表中找到 在下面的HTML表格中,我希望countComments等于任何给定submissionid的MySQL表格comment中出现名为commentid的字段的次数,其中su

下面的代码非常有效。它组合了来自两个MySQL表的数据。我想通过从第三个MySQL表
comment
中提取一些数据来修改它

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

在下面的HTML表格中,我希望
countComments
等于任何给定
submissionid
的MySQL表格
comment
中出现名为
commentid
的字段的次数,其中
submissionid
submissionid
comment
表格中都是相同的,其中
submissionid
对应于正在使用的
标题

这里有一个问题:如果MySQL表
comment
中没有与
submissionid
对应的行,我希望
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>";
$sqlStr=“选择s.loginid、s.title、s.url、s.displayurl、l.username
从提交为s,
以l身份登录
其中s.loginid=l.loginid
按s.Date提交的订单说明
限制10”;
$result=mysql\u查询($sqlStr);
$arr=array();
回声“;
而($row=mysql\u fetch\u数组($result)){
回声';
回声';
回声';
回声';
回声';
回声';
}
回声“;

如果我正确理解您的问题,那么:

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

您正在进行内部联接,但需要外部联接,特别是左联接。使用左联接时,表“在左边”总是联接的,如果没有对应关系,则右边表的字段设置为null。这种差异在这一点上得到了很好的解释

然后,您必须对具有相同提交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
可能有错误,我没有测试查询。。。但是我希望给你一个正确的想法,那就是外部联接和内部联接之间的区别。

试试看

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

如果我没有(m)任何打字错误:)


如果对你有用的话,我可以提供更多的解释。

嗯。。。我试过了,但结果一无所获。就像查询没有结果一样。您必须修改它以确保字段正确。例如,我编写了COUNT(c.id),但我不知道comments表的主键叫什么。在运行它之前,只需确保所有字段/表名都正确即可。此外,请确保您正在从数据库中读取错误以获取更多线索。有两件事-一旦使用group by,您必须在group by下包含剩余字段,或者同时在这些字段上使用聚合函数(max、min、avg、sum、count等)。如果正确写入select,则无需执行以下操作:。看这里,我做了一个测试,所有的工作如预期。。。如果s.id对于每次提交都是唯一的(例如,它是一个主索引),那么您不需要在注释中按其他字段+1分组,因为在mysql中不需要分组或聚合(不知道这一点);另一方面-我的测试表明,您可以删除IF(c.submissionid为NULL,0,COUNT(*),并将其替换为COUNT(c.submissionid)(关键部分是从左连接指定commining列,否则如果有必要)+1删除IF,我将在以后的查询中使用它,谢谢您的帮助,但是我仍然得到了这些的空白结果。你在php中得到了空白吗?为什么不直接在mysql中运行查询以查看确切的SQL错误消息,这会有帮助:)submissionid字段在submission和comment表中的确切名称是什么?
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