我已经被困在某件事上几天了,我真的希望有人能帮助我。
我有一个名为 $default_districts 的数组,它是通过查询生成的,用于查找从某个点到预定义半径内的邮政编码区...因此存储的值的数量是动态的。
[0] => NR1
[1] => NR12
[2] => NR13
[3] => NR14
... etc.
最终,我试图找出在另一个地址的“半径”内有多少客户。 所以,我想使用绑定(bind)到准备好的语句的这些值......
例如
// get data records within the default radius
if ($stmt = $mysqli->prepare("SELECT clientdata_urn, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district = ?)) {
// bind param to vars
$stmt->bind_param( // LOOP THROUGH $default_districts HERE // ));
// execute statement
$stmt->execute();
// store
$stmt->store_result();
// get numrows
$total_numrows = $stmt->num_rows;
// close statement
$stmt->close();
} else {
// error
printf("Error counting total data within default radius: %s\n", $mysqli->error);
}
如果我对我想要创建的内容进行硬编码,它将是这样的......
SELECT clientdata_urn, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district = 'NR1' OR clientdata_district = 'NR12' OR clientdata_district = 'NR13' OR clientdata_district = 'NR14'
我是个新手,任何帮助将不胜感激。
谢谢。
最佳答案
欢迎来到SO,@Rachi。我相信这会解决您的问题。
首先,使用 IN 比使用一系列 OR 语句要好得多。我整理了一个SQLFIDDLE来证明这一点。
这采用以下形式
SELECT COUNT(id) as num_users, clientdata_district
FROM tblhub_clientdata
WHERE clientdata_district IN ('NR12', 'NR14')
GROUP BY clientdata_district
输出给出数组中每个区号内的用户数量。如果您想要您所在区域内所有区域的用户总数(您的问题不清楚),那么只需删除 GROUP BY 行 like this .
下一个挑战是构建字符串,以便将其放入查询中。最简单的方法是使用 implode function .
$query_string = implode(",", $default_districts)
$sql = "SELECT COUNT(id) as num_users, clientdata_district";
$sql.= "FROM tblhub_clientdata";
$sql.= "WHERE clientdata_district IN ($query_string)";
$sql.= "GROUP BY clientdata_district";
请注意,这不会在您的区号中添加 ' 标记,但从我所看到的您的代码来看,我认为这并不重要。最坏的情况只是丢弃 implode 语句并在 FOR 循环中构建字符串。
关于PHP/MySQLi - 循环数组以构建动态 WHERE 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31701816/