2015-07-29 3 views
0

Я уже несколько дней застрял на чем-то, и я действительно надеюсь, что кто-то может мне помочь.PHP/MySQLi - цикл через массив для создания динамического предложения WHERE

У меня есть массив с именем $ default_districts, который генерируется запросом, чтобы найти почтовые индексы в пределах предопределенного радиуса из точки ... так что количество сохраненных значений является динамическим.

[0] => NR1 
[1] => NR12 
[2] => NR13 
[3] => NR14 
... etc. 

В конечном счете, я пытаюсь выяснить, сколько клиентов находится в радиусе от другого адреса. Итак, я хочу использовать эти значения, привязанные к подготовленному заявлению ...

например.

// 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

Вы хотите, чтобы количество значений не было значений? Если да, то лучше использовать ** GROUP BY ** с ** HAVING **. В ** GROUP BY ** мы используем ** HAVING ** вместо оператора ** WHERE ** mysql. Следующие ссылки могут вам помочь. http://www.mysqltutorial.org/mysql-having.aspx и https://dev.mysql.com/doc/refman/5.0/en/group-by-handling.html –

+1

Вместо использования большого количества операторов OR для Возможные значения одного и того же поля, вы бы лучше искали В массиве: WHERE x IN ('a', 'b', 'c') – Eddy

+0

Спасибо @ web2students, но моя проблема заключается в выборе записей, где 'clientdata_district' соответствует любому из значения в моем массиве, о которых ни одна из этих ссылок не упоминает, поэтому не знаете, как это изменится в GROUP BY? – Rachi

ответ

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.

Смежные вопросы