【发布时间】:2013-08-18 21:44:57
【问题描述】:
我有这 2 个 mysql 表:TableA 和 TableB
表A
* 列 ID
* A1栏
* ColumnA2
TableB
* 列BId
* 列 ID
* 列 B1
* B2栏
在 PHP 中,我想要这种多维数组格式
$array = array(
array(
'ColumnAId' => value,
'ColumnA1' => value,
'ColumnA2' => value,
'TableB' => array(
array(
'ColumnBId' => value,
'ColumnAId' => value,
'ColumnB1' => value,
'ColumnB2' => value
)
)
)
);
这样我就可以这样循环了
foreach($array as $i => $TableA) {
echo 'ColumnAId' . $TableA['ColumnAId'];
echo 'ColumnA1' . $TableA['ColumnA1'];
echo 'ColumnA2' . $TableA['ColumnA2'];
echo 'TableB\'s';
foreach($value['TableB'] as $j => $TableB) {
echo $TableB['...']...
echo $TableB['...']...
}
}
我的问题是,为了实现这个目标,查询 MySQL 数据库的最佳方式或正确方式是什么?
Solution1 --- 我正在使用的那个
$array = array();
$rs = mysqli_query("SELECT * FROM TableA", $con);
while ($row = mysqli_fetch_assoc($rs)) {
$rs2 = mysqli_query("SELECT * FROM Table2 WHERE ColumnAId=" . $row['ColumnAId'], $con);
// $array = result in array
$row['TableB'] = $array2;
}
我怀疑我的代码总是在查询数据库。
解决方案2
$rs = mysqli_query("SELECT * FROM TableA JOIN TableB ON TableA.ColumnAId=TableB.ColumnAId");
while ($row = mysqli_fet...) {
// Code
}
第二个解决方案只查询一次,但是如果我在 TableA 中有数千行,在 TableB 中有数千行对于每个 TableB.ColumnAId (1 TableA.ColumnAId = 1000 TableB.ColumnAId),那么这个解决方案 2 比解决方案1?
【问题讨论】:
-
我假设在解决方案 1 中,您确实在第二个查询中使用 WHERE 子句仅从 TableB 中获取与 TableA 中特定行相关的行?在这种情况下,我个人更喜欢解决方案 1,除非其他人以更好的想法/分析做出回应。
-
@TomasCreemers - 不,这是一个非常糟糕的做法,使用循环查询(请参阅下面的答案)
-
@TomasCreemers 在循环中进行查询基本上是“不要使用 SQL”的第 2 条规则,在查询中插入未经处理的用户输入。
-
@SweetieBelle ...这将是糟糕的规则之一。使用多个查询比使用单个查询更好/更快的原因有很多。锁粒度是一个,MySQL 优化器不好是另一个,临时表开销仍然是另一个,我可能还可以举出一些其他的。
-
@griffin 锁定粒度在执行
SELECT语句时不太可能成为问题,原因我们已经讨论过。很可能,您不希望在读取数据时更改数据库(出于关系完整性原因),因此最好等待任何写入操作。 极不可能任何其他因素加起来的性能开销与数百或数千个连接、执行和响应的成本相同,即使是在 UNIX 套接字上也是如此。
标签: php mysql optimization