PHP-用join替换子查询?
好的,现在我在while循环中有一个来自另一个查询的查询…但是必须有一个更有效的方法来完成我正在尝试的事情。我可以通过一个查询完成下面的脚本吗?这样会更有效率吗?(我假设是这样)以下是我现在拥有的(不是真正的代码,而是一个很好的示例):PHP-用join替换子查询?,php,join,subquery,Php,Join,Subquery,好的,现在我在while循环中有一个来自另一个查询的查询…但是必须有一个更有效的方法来完成我正在尝试的事情。我可以通过一个查询完成下面的脚本吗?这样会更有效率吗?(我假设是这样)以下是我现在拥有的(不是真正的代码,而是一个很好的示例): $sth=$dbh->prepare(“从bug限制5中选择*); $sth->setFetchMode(PDO::FETCH_OBJ); $sth->execute(); 而($row=$sth->fetch()){ $bugId=$row->id; 回显“B
$sth=$dbh->prepare(“从bug限制5中选择*);
$sth->setFetchMode(PDO::FETCH_OBJ);
$sth->execute();
而($row=$sth->fetch()){
$bugId=$row->id;
回显“Bug Name:”。$row->Name;
回声“
”;
回显“受影响的Web浏览器:”;
$sth2=$dbh->prepare(“从BugId='$BugId'的受影响浏览器中选择*);
$sth2->setFetchMode(PDO::FETCH_OBJ);
$sth2->execute();
$i=1;
而($row2=$sth2->fetch()){
如果($i=1){
echo$row2->浏览器;
}否则{
echo','.$row2->浏览器;
}
$i++;
}
}
我的表格如下:
1) “bug”-此表中列出的每个bug对应一行。
2) “AffectedBrowser”-此表包含特定bug的所有受影响浏览器。此表通过“AffectedBrowser”表中的bugId列与“Bugs”表有关系
注意:我确实意识到增加$I可以在for循环中完成,而不是在if/else中完成
更新:每个bug只需要一行,我猜在结果集中添加一列,列出了该bug的所有受影响浏览器。
SELECT * FROM Bugs
INNER JOIN AffectedBrowsers ON Bugs.Id = AffectedBrowsers.BugId
LIMIT 5
这就是你要找的吗
SELECT * FROM Bugs
LEFT JOIN AffectedBrowsers
ON Bugs.BugId = AffectedBrowsers.BugId
LIMIT 5
这就是你要找的吗
SELECT * FROM Bugs
LEFT JOIN AffectedBrowsers
ON Bugs.BugId = AffectedBrowsers.BugId
LIMIT 5
如果您想列出bug,即使没有受影响的浏览器。顺便说一下,您应该养成列出哪些列不想从中检索数据的习惯
如果您想列出bug,即使没有受影响的浏览器。顺便说一句,你应该养成列出你不想从中检索数据的列的习惯。其他答案都很好。但是,如果您需要限制bug的数量,而不关心受影响浏览器的数量,请使用以下方法:
SELECT *
FROM AffectedBrowsers
WHERE BugID IN ( SELECT id FROM Bugs LIMIT 5 )
请注意,这是一个真正的子查询。但是,与您的代码不同,它包含在一条语句中,应该更快。其他答案都很好。但是,如果您需要限制bug的数量,而不关心受影响浏览器的数量,请使用以下方法:
SELECT *
FROM AffectedBrowsers
WHERE BugID IN ( SELECT id FROM Bugs LIMIT 5 )
SELECT *
FROM Bugs
INNER JOIN
(SELECT BugId, GROUP_CONCAT(Browser) Browsers FROM AffectedBrowsers GROUP BY BugId) Aff
ON Bugs.Id = Aff.BugId
请注意,这是一个真正的子查询。但是,与您的代码不同,它包含在一条语句中,应该更快。是否需要
限制5
?或者,不管“bug”的数量有多少,限制“受影响的浏览器”的总数可以吗?限制为5是因为我只想在实现此功能的特定页面上显示5个bug。但我不能限制受影响的浏览器总数,因为我现在需要检查每个受bug影响的浏览器。请参阅David Hirst的答案。LIMIT 5
限制的是总体结果,而不是bug。相反,如果您需要限制bug,这会使事情复杂化。limit 5
是否有必要?或者,不管“bug”的数量有多少,限制“受影响的浏览器”的总数可以吗?限制为5是因为我只想在实现此功能的特定页面上显示5个bug。但我不能限制受影响的浏览器总数,因为我现在需要检查每个受bug影响的浏览器。请参阅David Hirst的答案。LIMIT 5
限制的是总体结果,而不是bug。相反,如果您需要限制bug,这会使事情复杂化..呵呵,是的,尽管我假设bug主键名为Id;)确保它是相关的键:$bugId=$row->id代码>这让我很接近。尽管如此,在运行此查询时,如果有多个浏览器(即Firefox、Chrome和Safari)受到一个bug的影响,那么我会从查询中返回三行,而不是一行中列出所有受影响的浏览器。也许我在那一部分的问题措词有误。每个bug只需要一行,我猜在结果集中添加一列,列出了该bug的所有受影响浏览器。INNER JOIN AffectedBrowsers ON Bugs.Id=AffectedBrowsers.BugId
有效…这只是一个例子。只需在处理结果集时检查bug
Id即可。仅在ID更改时启动新行,否则只需将其添加到受影响的浏览器列。添加一个按bug排序的ORDER.ID
,在这种情况下,让bug保持在某种程度上分组在一起。呵呵,是的,尽管我假设bug主键被称为ID;)确保它是相关的键:$bugId=$row->id代码>这让我很接近。尽管如此,在运行此查询时,如果有多个浏览器(即Firefox、Chrome和Safari)受到一个bug的影响,那么我会从查询中返回三行,而不是一行中列出所有受影响的浏览器。也许我在那一部分的问题措词有误。每个bug只需要一行,我猜在结果集中添加一列,列出了该bug的所有受影响浏览器。INNER JOIN AffectedBrowsers ON Bugs.Id=AffectedBrowsers.BugId
有效…这只是一个例子。只需在处理结果集时检查bug
Id即可。仅在ID更改时启动新行,否则只需将其添加到受影响的浏览器列。添加一个按bug排序的。ID
在这种情况下,让bug保持在一起。是的,我知道,它将出现在我的产品代码中…这只是示例代码。是的,我知道,它将出现在我的产品代码中…这只是示例代码。是的,考虑过这一点,但我总是对这些子查询感到厌倦。这就是为什么我询问限制的原因。如果需要限制bug,我看不到其他解决方案。OTOH,有了一个像样的数据库,即使有一个大型数据库,这也不会太慢。这当然比为同一个任务启动六个查询要好。是的,考虑过这一点,但我总是对这些感到厌倦
SELECT *
FROM Bugs
INNER JOIN
(SELECT BugId, GROUP_CONCAT(Browser) Browsers FROM AffectedBrowsers GROUP BY BugId) Aff
ON Bugs.Id = Aff.BugId