我被告知在循环中使用查询(select)是一种不好的做法,因为它会降低服务器性能。
我有一个数组,如
Array ( [1] => Los Angeles )
Array ( [2] =>New York)
Array ( [3] => Chicago )
这些只是3个索引。我正在使用的数组没有常量大小,因此有时它可以包含多达20个索引。
现在,我正在做的是(这不是所有的代码,而是基本的想法)
输出将如下所示:
Los Angeles
Michael Stern
David Bloomer
William Rod
New York
Kary Mills
Chicago
Henry Davidson
Ellie Spears
我知道这是一种非常低效的方法,因为随着表格随后变大,可能会出现大量查询。
所以我的问题是,是否有一种更好,更有效的方法来根据数组中的内容选择信息,这些内容可以是任何大小?
答案 0 :(得分:4)
使用IN
查询,该查询将获取单个查询中的所有结果:
SELECT * FROM people WHERE town IN('LA', 'London', 'Paris')
答案 1 :(得分:4)
要进一步添加到MrCodes答案,如果您从数组开始: -
$Cities = array(1=>'Los Angeles', 2=>'New York', 3=>'Chicago');
$query = "SELECT town, personname FROM people WHERE town IN('".implode("','", $Cities)."') ORDER BY town";
if ($sql = $mysqliconnection->prepare($query))
{
$sql->execute();
$result = $sql->get_result();
$PrevCity = '';
while ($row = $result->fetch_assoc())
{
if ($row['town'] != $PrevCity)
{
echo $row['town']."<br />";
$PrevCity = $row['town'];
}
echo $row['personname']."<br />";
}
}
作为数据库设计问题,您可能应该在单独的表中使用城镇名称,并且该人员的表包含城镇的ID而不是实际的城镇名称(使验证更容易,更快,并且验证更不可能错过记录,因为有人错误地写了他们的家乡)
答案 2 :(得分:1)
作为@MrCode mentions,您可以使用MySQL的IN()
运算符一次性获取所有所需城市的记录,但如果您然后sort主要通过PDO结果你可以循环遍历结果集,跟踪最后看到的城市,并在第一次遇到新城市时输出新城市。
使用FIELD()
和MySQL {{3}}函数确保结果集与原始数组的顺序相同(如果您不关心它,那么,可以简单地做ORDER BY city
,这会更有效率,特别是在city
列上有合适的索引):
$arr = ['Los Angeles', 'New York', 'Chicago'];
$placeholders = rtrim(str_repeat('?, ', count($arr)), ', ');
$dbh = new PDO("mysql:dbname=$dbname", $username, $password);
$qry = $dbh->prepare("
SELECT city, name
FROM my_table
WHERE city IN ($placeholders)
ORDER BY FIELD(city, $placeholders)
");
if ($qry->execute(array_merge($arr, $arr))) {
// output headers
echo '<ul>';
$row = $qry->fetch();
while ($row) {
$current_city = $row['city'];
// output $current_city initialisation
echo '<li>'.htmlentities($current_city).'</li><ul>';
do {
// output name $row
echo '<li>'.htmlentities($row['name']).'</li>';
} while ($row = $qry->fetch() and $row['city'] == $current_city);
// output $current_city termination
echo '</ul>';
}
// output footers
echo '</ul>';
}
答案 3 :(得分:0)
这是准备好的陈述的目的。将占位符绑定到值,并将其用作具有相同查询的变量。由于查询没有改变,因此最大限度地减少了与mysql服务器的通信,从而提高了效率。
使用PDO的示例:
$cities = array(
"Los Angeles",
"New York",
"Chicago"
);
try {
//Change database parameters here (user, pass, database name)
$db = new PDO("mysql:host=localhost;dbname=users", "user", "pass");
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$stmt = $db->prepare("SELECT * FROM `users` WHERE `city` = :city");
foreach ($cities as $city) {
$stmt->bindValue(":city", $city);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
//Output data here. You can format it however you'd like
var_dump($city, $result);
}
}
catch (PDOException $e) {
//Error handling here
}