根据另一个 MySQL 查询获取数据
Fetch data based on another MySQL query
我有以下两个问题。第一个查询是从第一个名为 tags
的 table 中获取一个名为 srNumber
的键,然后第二个查询使用该 srNumber
从第二个 table 中获取详细信息称为 nexttable
.
$tagQuery = "SELECT * FROM tags WHERE status = 0 AND currentStage = '1' AND assignedTo = '1' ORDER BY
deliveryDate ASC";
$tagQueryExecute = mysqli_query($conn, $tagQuery);
while($rows = mysqli_fetch_array($tagQueryExecute)){
$srNumber = $rows['srNumber'];
$nextQuery = "SELECT * FROM nexttable WHERE srNumber='$srNumber'";
$nextQueryExecute = mysqli_query($conn, $nextQuery);
$detailsFromNextTable = mysqli_fetch_array($nextQueryExecute);
//Show these details
}
对于一个小的结果,这不是一个大问题。但是如果第一个查询得到这么多结果,那么第二个查询必须 运行 循环次数的倍数。有没有其他方法可以有效地做到这一点?
注意:请忽略这些查询的 SQL 注入问题。我只是简化它以显示问题
因为您似乎在第二行中只有 1 行 table,您最好使用联接,MySQL: Quick breakdown of the types of joins 提供了有关联接类型的更多信息。
SELECT *
FROM tags t
JOIN nexttable n on t.srNumber = n.srNumber
WHERE t.status = 0 AND t.currentStage = '1' AND t.assignedTo = '1'
ORDER BY t.deliveryDate ASC
这也删除了 SQL 注入。
我还建议删除 *
并只列出您打算使用的列,如果您在不同的 table 中具有相同名称的列,这也会有所帮助,因为您可以添加特定列的别名。
仅供参考 - 您遇到的原始问题类似于 What is the "N+1 selects problem" in ORM (Object-Relational Mapping)?
我有以下两个问题。第一个查询是从第一个名为 tags
的 table 中获取一个名为 srNumber
的键,然后第二个查询使用该 srNumber
从第二个 table 中获取详细信息称为 nexttable
.
$tagQuery = "SELECT * FROM tags WHERE status = 0 AND currentStage = '1' AND assignedTo = '1' ORDER BY
deliveryDate ASC";
$tagQueryExecute = mysqli_query($conn, $tagQuery);
while($rows = mysqli_fetch_array($tagQueryExecute)){
$srNumber = $rows['srNumber'];
$nextQuery = "SELECT * FROM nexttable WHERE srNumber='$srNumber'";
$nextQueryExecute = mysqli_query($conn, $nextQuery);
$detailsFromNextTable = mysqli_fetch_array($nextQueryExecute);
//Show these details
}
对于一个小的结果,这不是一个大问题。但是如果第一个查询得到这么多结果,那么第二个查询必须 运行 循环次数的倍数。有没有其他方法可以有效地做到这一点?
注意:请忽略这些查询的 SQL 注入问题。我只是简化它以显示问题
因为您似乎在第二行中只有 1 行 table,您最好使用联接,MySQL: Quick breakdown of the types of joins 提供了有关联接类型的更多信息。
SELECT *
FROM tags t
JOIN nexttable n on t.srNumber = n.srNumber
WHERE t.status = 0 AND t.currentStage = '1' AND t.assignedTo = '1'
ORDER BY t.deliveryDate ASC
这也删除了 SQL 注入。
我还建议删除 *
并只列出您打算使用的列,如果您在不同的 table 中具有相同名称的列,这也会有所帮助,因为您可以添加特定列的别名。
仅供参考 - 您遇到的原始问题类似于 What is the "N+1 selects problem" in ORM (Object-Relational Mapping)?