PHP-用join替换子查询?

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

好的,现在我在while循环中有一个来自另一个查询的查询…但是必须有一个更有效的方法来完成我正在尝试的事情。我可以通过一个查询完成下面的脚本吗?这样会更有效率吗?(我假设是这样)以下是我现在拥有的(不是真正的代码,而是一个很好的示例):

$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