Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сортировка при запросе в цикле
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Сортировка при запросе в цикле

Страниц (1): [1]
 

1. Sabonett - 10 Июня, 2013 - 14:34:37 - перейти к сообщению
Доброго времени!

Имеется переменная $sort которая содержит в себе многомерный массив с однородной структурой подмассивов:

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [16] => Array
  4.         (
  5.             [0] => 1
  6.         )
  7.  
  8.     [12] => Array
  9.         (
  10.             [0] => 58
  11.         )
  12.  
  13.     [10] => Array
  14.         (
  15.             [0] => 44
  16.         )
  17.  
  18.     [14] => Array
  19.         (
  20.             [0] => 105
  21.         )
  22.  
  23.  
  24. )
  25.  


Для каждого подмассива в цикле выполняется запрос к mysql:


PHP:
скопировать код в буфер обмена
  1. foreach($sort as $v){
  2.  
  3. $sql="select * from ".$SysValue['base']['table_name20']." where id=$v";
  4. $result=mysql_query($sql);
  5. $SysValue['sql']['num']++;
  6. while ($row = mysql_fetch_assoc($result))
  7.     {
  8.         $id=$row['id'];
  9.         $num=$row['num'];
  10. }
  11. }
  12.  



результат вполне ожидаем:


PHP:
скопировать код в буфер обмена
  1. (
  2.     [id] => 16
  3.     [num] => 3
  4.  )
  5. (
  6.     [id] => 12
  7.     [num] => 1
  8.  )
  9. (
  10.     [id] => 10
  11.     [num] => 4
  12.  )
  13. (
  14.     [id] => 14
  15.     [num] => 2
  16.  )



Теперь вопрос: как отсортировать эти массивы по ключу [num] (1,2,3,4) ? И возможно ли это сделать средствами mysql? (order by num не работает, т.к. цикл и он перебирает все подмассивы).

Начальное количество подмассивов неизвестно.

Заранее спасибо за помощь!


Решение:

PHP:
скопировать код в буфер обмена
  1. $sql = 'SELECT * FROM '.$SysValue['base']['table_name20'].' where id IN ('.implode(', ', $sort).') ORDER BY num ASC';
2. esterio - 10 Июня, 2013 - 15:14:38 - перейти к сообщению
3. Sabonett - 10 Июня, 2013 - 15:20:15 - перейти к сообщению
esterio пишет:


(order by num не работает, т.к. цикл и он перебирает все подмассивы).
4. avtor.fox - 10 Июня, 2013 - 15:24:52 - перейти к сообщению
Sabonett, голубчик. Так если у Вас мильонъ записей, то получите мильонъ подзапросов. Зачем Вам такие опасности совершать для сфинктера?
5. Sabonett - 10 Июня, 2013 - 15:30:19 - перейти к сообщению
avtor.fox пишет:
Sabonett, голубчик. Так если у Вас мильонъ записей, то получите мильонъ подзапросов. Зачем Вам такие опасности совершать для сфинктера?


Записей около 10-15, просто их id берется из первого массива и на основании этих id делаются запросы в цикле, а поскольку запрос идет в цикле 'num' не работает Недовольство, огорчение
6. DeepVarvar - 10 Июня, 2013 - 15:36:23 - перейти к сообщению

Sabonett пишет:
не работает
Нет слова "не могу", есть слово "не хочу". Подмигивание
7. avtor.fox - 10 Июня, 2013 - 15:37:09 - перейти к сообщению
Sabonett пишет:
Записей около 10-15

Это сейчас.

Вы лучше приведите структуру таблиц и что с чем нужно связать.
8. esterio - 10 Июня, 2013 - 15:55:29 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $sql = 'SELECT * FROM '.$SysValue['base']['table_name20'].' where id IN ('.implode(', ', $sort).') ORDER BY num ASC';

?
9. avtor.fox - 10 Июня, 2013 - 16:05:49 - перейти к сообщению
esterio пишет:
?

??
10. Sabonett - 10 Июня, 2013 - 16:21:32 - перейти к сообщению
esterio пишет:
PHP:
скопировать код в буфер обмена
  1. $sql = 'SELECT * FROM '.$SysValue['base']['table_name20'].' where id IN ('.implode(', ', $sort).') ORDER BY num ASC';

?


Вы гений! Все работает именно так, как нужно.
11. avtor.fox - 10 Июня, 2013 - 16:32:58 - перейти к сообщению
Sabonett, славно, если конечно не вырастет количество строк.

 

Powered by ExBB FM 1.0 RC1