@radio_mus

Почему фильтр срабатывает неправильно?

Здравствуйте, не могу разобраться почему фильтр работает неправильно при выгрузке данных из БД в перемешанном виде.

Создаю 2 массива и заношу в них инфу из БД:
$result = mysql_query("SELECT * FROM `reg_user` order by rand()",$link);

    if (mysql_num_rows($result) > 0)
        {
    $row = mysql_fetch_array($result);
             do
            {
             $one[] = array('email' => $row["email"],
                            'sending' => $row["sending"],
                            'sex' => $row["sex"],
                            'city' => $row["city"],
                            'country' => $row["country"],
                            'zip' => $row["zip"]);
                
             $two[] = array('email' => $row["email"],
                            'sending' => $row["sending"],
                            'sex' => $row["sex"],
                            'city' => $row["city"],
                            'country' => $row["country"],
                            'zip' => $row["zip"]);
            }
             while ($row = mysql_fetch_array($result));
        }


Далее перебираю и сравниваю, если подходит под критерии, то выдергиваю из массива и емаилы заношу в таблицу БД:
$cnt1 = count($one);
$cnt2 = count($two);

for($i=0;$i<$cnt1;$i++){

    if($one[$i]["sending"]=='city'){ 
        
        for($j=0;$j<$cnt2;$j++){

            if($one[$i]["city"]==$two[$j]["city"] && 
               $one[$i]["sex"]!=$two[$j]["sex"] && 
               $one[$i]["zip"]!=$two[$j]["zip"]){
            
mysql_query("INSERT INTO orders(order_datetime,sender,receiver) VALUES(NOW(), '".$one[$i]['email']."',	'".$two[$j]['email']."')");
mysql_query("INSERT INTO orders(order_datetime,sender,receiver) VALUES(NOW(), '".$two[$j]['email']."',	'".$one[$i]['email']."')");

unset ($one[$i]);
 unset ($two[$j]);
  unset ($one[$j]);
   unset ($two[$i]);
   break;
    }
}
    }
}


Так вот, если в основном запросе при создании массивов, выгружаются данные в рандомном порядке:
$result = mysql_query("SELECT * FROM `reg_user` order by rand()",$link);

то фильтр срабатывает не полностью и почему то выгружает не все совпавшие пары и каждый раз разное количество, но если делать выгрузку в обычном режиме:
$result = mysql_query("SELECT * FROM `reg_user`",$link);

то все работает нормально.

Вопрос: почему так происходит? Почему фильтр не выбирает все адреса, если в массив попадают данные в рандом порядке?

Подозреваю, что проблема кроется в работе циклов, но не понимаю, что в них не так.
  • Вопрос задан
  • 86 просмотров
Пригласить эксперта
Ответы на вопрос 1
photozoom
@photozoom
Если вам действительно нужно случайным образом располагать строки в результате вашего запроса, то существует множество лучших способов решить такую задачу. Конечно, это будет реализовано дополнительным кодом, но вы будете спасены от проблемы, которая растет по экспоненциальному закону вместе с ростом объема данных. Дело в том, что MySQL выполняет операцию RAND() (которая занимает время процессора) для каждой отдельной строки в таблице перед тем, как отсортировать ее и выдать вам только одну строку.
// Так делать НЕ НУЖНО:
	$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1"); 

	// Вот так будет лучше работать:
	$r = mysql_query("SELECT count(*) FROM user");
	$d = mysql_fetch_row($r);
	$rand = mt_rand(0,$d[0] - 1);
	$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");


Так вы получаете случайное число, которое меньше, чем количество строк в результате запроса, и используете его как смещение в предложении LIMIT.
Источник
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽