好的,所以现在我在另一个查询的while循环中有一个查询...但是我必须更有效地做我想做的事情。我可以通过一个查询完成以下脚本吗?这会更有效吗? (我假设它会是这样的)这就是我现在所拥有的(不是真正的代码,而是一个很好的例子):
$sth = $dbh->prepare("SELECT * FROM Bugs LIMIT 5");
$sth->setFetchMode(PDO::FETCH_OBJ);
$sth->execute();
while($row = $sth->fetch()){
$bugId = $row->id;
echo 'Bug Name: ' . $row->name;
echo '<br />';
echo 'Affected Web Browsers: ';
$sth2 = $dbh->prepare("SELECT * FROM AffectedBrowsers WHERE BugId = '$bugId'");
$sth2->setFetchMode(PDO::FETCH_OBJ);
$sth2->execute();
$i = 1;
while($row2 = $sth2->fetch()){
if($i = 1){
echo $row2->browser;
}else{
echo ', ' . $row2->browser;
}
$i++;
}
}
我的表格如下: 1)&#34; Bugs&#34; - 对于列出的每个错误,此表都有一行。 2)&#34; AFfectedBrowsers&#34; - 此表包含针对特定错误的所有受影响的浏览器。该表与&#34; Bugs&#34;有关系。表通过&#34; AffectedBrowsers&#34;中的bugId列表
注意:我确实意识到增加$ i可以在for循环中完成而不是if / else。
更新:我每个bug只需要一行,并且我猜测在结果集中添加一列,其中包含列出该错误的所有受影响的浏览器。
答案 0 :(得分:4)
SELECT * FROM Bugs
INNER JOIN AffectedBrowsers ON Bugs.Id = AffectedBrowsers.BugId
LIMIT 5
这是你想要的吗?
答案 1 :(得分:2)
SELECT * FROM Bugs
LEFT JOIN AffectedBrowsers
ON Bugs.BugId = AffectedBrowsers.BugId
LIMIT 5
如果您想列出错误,即使没有受影响的浏览器。顺便说一句,你应该养成列出你想从中检索数据的列的习惯。
答案 2 :(得分:1)
SELECT *
FROM Bugs
INNER JOIN
(SELECT BugId, GROUP_CONCAT(Browser) Browsers FROM AffectedBrowsers GROUP BY BugId) Aff
ON Bugs.Id = Aff.BugId
答案 3 :(得分:0)
其他答案都很好。但是,如果您需要限制错误数量而不关心受影响的浏览器数量,请使用以下命令:
SELECT *
FROM AffectedBrowsers
WHERE BugID IN ( SELECT id FROM Bugs LIMIT 5 )
请注意,这是一个真实的子查询。但是,与您的代码不同,它包含在一个语句中,并且应该更快。