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