我已经被困在某事上几天了,而且我真的希望有人可以帮助我。
我有一个名为$ default_districts的数组,它通过查询生成,以便从一个点找到预定义半径内的邮政编码区...所以存储的值的数量是动态的。
[0] => NR1
[1] => NR12
[2] => NR13
[3] => NR14
... etc.
最终,我试图了解有多少客户在"半径范围内"来自另一个地址。 所以,我想把这些值绑定到准备好的声明......
e.g。
// 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'
我有点新手,非常感谢任何帮助。
谢谢。
答案 0 :(得分:0)
欢迎来到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循环中构建字符串。