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 » PHP » SQL и Архитектура БД » Правильный запрос

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

1. Silus - 01 Августа, 2007 - 11:14:45 - перейти к сообщению
Есть два массива: $mass1 и $mass2. Эти массивы состоят из различных цифр (1,23,4,56,7...).
Причем кол-во элементов в $mass1 >= $mass2.

Как лучше вставить $mass2 в таблицу на определенный ID, чтобы потом проверить наличие всех элементов из табличной записи в массиве $mass1.

Например:
$mass1=1,3,5,7,8,9;
Таблица(
id=1 value=2,3,4,5
id=2 value=1,3,5
...
)
Из этой таблицы должна вывестись только запись с id=2 , так как в value имеются все числа из $mass1.

Как это лучше сделать?
2. kuzya - 01 Августа, 2007 - 11:38:29 - перейти к сообщению
Если я правильно понял (в чём сомневаюсь) то нужно просто сделать чтонить типа
PHP:
скопировать код в буфер обмена
  1.  
  2. $query = "SELECT value FROM table WHERE id=2";
  3. $result = mysql_query($query);
  4. /*Здесь учитываем что есть всего 1 запись с id=2*/
  5. $line=mysql_fetch_array($result,MYSQL_ASSOC);
  6. $values = explode(",",$line['value']);
  7. /* Просто поочерёдно проверяем наличие текущего элемента в массиве mass1*/
  8. foreach($values as $value)
  9. {
  10.     if (in_array($value,$mass1))
  11.    {
  12.         print "Value in mass1";
  13.    }
  14. }
  15.  
3. Silus - 01 Августа, 2007 - 11:45:21 - перейти к сообщению
Но ведь записей может быть сотни,тысячи:
А нужно выбрать ВСЕ такие записи.
Может надо изменить структуру таблицы?
4. kuzya - 01 Августа, 2007 - 12:14:03 - перейти к сообщению
Если записей куча то код примерно(!примерно) следующий:
PHP:
скопировать код в буфер обмена
  1.  
  2.  $query = "SELECT value FROM table WHERE id=2";
  3.  $result = mysql_query($query);
  4.  
  5.  while($line=mysql_fetch_array($result,MYSQL_ASSOC))
  6. {
  7.  $values = explode(",",$line['value']);
  8.  /* Просто поочерёдно проверяем наличие текущего элемента в массиве mass1*/
  9.  foreach($values as $value)
  10.  {
  11.      if (in_array($value,$mass1))
  12.     {
  13.          print "Value in mass1";
  14.     }  
  15.  }
  16. }
  17.  
5. Silus - 01 Августа, 2007 - 12:33:27 - перейти к сообщению
Я имел ввиду, что id не обязательно должен быть равен 2, надо перебрать все id. Улыбка
Каждый id уникален.
Я пробовал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT *
  3. FROM table
  4. WHERE value in (массив)
  5.  

Но в этом случае выводятся записи при первом совпадении одного элемента. А мне нужно, чтобы все элементы из value были в массиве $mass1.
6. valenok - 01 Августа, 2007 - 16:36:48 - перейти к сообщению
выбирать каждую строку, разбивать на элементы и проверять на соответствие, особенно если много id и длинные value - займёт слишком много времени.

А вопрос наверное из серии:

Цитата:
Думаю, ты неправильно задаешь вопрос. Гораздо лучше рассказать, какую задачу надо решить - вполне возможно, тебе здесь предложат гораздо более элегантный способ решения. Беда не слишком опытных программистов - они "придумывают" очень неудачный способ решения (а зачастую и просто нереализуемый), а потом приходят на форум и просят - "Помогите!". Самое плохое - они не рассказывают, как пришли к такому решению задачи - а просто просят - "Помогите!". Не надо идти по этому пути...

7. Silus - 01 Августа, 2007 - 18:50:10 - перейти к сообщению
valenok пишет:
Не надо идти по этому пути...

"Есть только два пути: правильный и по которому мы идем."
А вообще valenok ты прав.

Я решил добавлять массив $mass2 не в одно поле таблицы, а в несколько, т.е. сколько элементов в массиве, столько и полей. А числа из массива-это id записей из другой таблицы, количество записей в которой-фиксированной число, т.е. постоянное(~30).
Потом проверять на соответствие нужные поля и выводить запись. Полюбому будет быстрее, чем последовательный перебор.
8. valenok - 01 Августа, 2007 - 20:12:57 - перейти к сообщению
Но опять же, наверное вы придумали нелучший способ решения какойто задачи.
А на практике разбив строку вы не многое выиграли.
Вы выиграли лишь одну строку кода и немного времени.
9. Silus - 01 Августа, 2007 - 22:48:18 - перейти к сообщению
valenok пишет:
Но опять же, наверное вы придумали нелучший способ решения какойто задачи.
А на практике разбив строку вы не многое выиграли.
Вы выиграли лишь одну строку кода и немного времени.

Только что сделал, как я предлагал выше (разбиением на столбцы).
Вот результаты теста при 1000 записей:


Производительность увеличилась почти в 30 раз!
Я думаю valenok, это хороший выигрыш во времени. Правда mysql запрос получается огромным.
10. valenok - 02 Августа, 2007 - 00:35:55 - перейти к сообщению
Наше дело предложить

 

Powered by ExBB FM 1.0 RC1