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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Правильный запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Обработка данных MySQL
Silus
Отправлено: 01 Августа, 2007 - 11:14:45
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2007  


Помог: 0 раз(а)




Есть два массива: $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.

Как это лучше сделать?
 
 Top
kuzya
Отправлено: 01 Августа, 2007 - 11:38:29
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Февр. 2007  


Помог: 0 раз(а)




Если я правильно понял (в чём сомневаюсь) то нужно просто сделать чтонить типа
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.  
 
 Top
Silus
Отправлено: 01 Августа, 2007 - 11:45:21
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2007  


Помог: 0 раз(а)




Но ведь записей может быть сотни,тысячи:
А нужно выбрать ВСЕ такие записи.
Может надо изменить структуру таблицы?
 
 Top
kuzya
Отправлено: 01 Августа, 2007 - 12:14:03
Post Id


Гость


Покинул форум
Сообщений всего: 80
Дата рег-ции: Февр. 2007  


Помог: 0 раз(а)




Если записей куча то код примерно(!примерно) следующий:
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.  
 
 Top
Silus
Отправлено: 01 Августа, 2007 - 12:33:27
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2007  


Помог: 0 раз(а)




Я имел ввиду, что id не обязательно должен быть равен 2, надо перебрать все id. Улыбка
Каждый id уникален.
Я пробовал так:
PHP:
скопировать код в буфер обмена
  1.  
  2. SELECT *
  3. FROM table
  4. WHERE value in (массив)
  5.  

Но в этом случае выводятся записи при первом совпадении одного элемента. А мне нужно, чтобы все элементы из value были в массиве $mass1.
 
 Top
valenok
Отправлено: 01 Августа, 2007 - 16:36:48
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




выбирать каждую строку, разбивать на элементы и проверять на соответствие, особенно если много id и длинные value - займёт слишком много времени.

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

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



-----
Truly yours, Sasha.
 
My status
 Top
Silus
Отправлено: 01 Августа, 2007 - 18:50:10
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2007  


Помог: 0 раз(а)




valenok пишет:
Не надо идти по этому пути...

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

Я решил добавлять массив $mass2 не в одно поле таблицы, а в несколько, т.е. сколько элементов в массиве, столько и полей. А числа из массива-это id записей из другой таблицы, количество записей в которой-фиксированной число, т.е. постоянное(~30).
Потом проверять на соответствие нужные поля и выводить запись. Полюбому будет быстрее, чем последовательный перебор.
 
 Top
valenok
Отправлено: 01 Августа, 2007 - 20:12:57
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Но опять же, наверное вы придумали нелучший способ решения какойто задачи.
А на практике разбив строку вы не многое выиграли.
Вы выиграли лишь одну строку кода и немного времени.


-----
Truly yours, Sasha.
 
My status
 Top
Silus
Отправлено: 01 Августа, 2007 - 22:48:18
Post Id


Новичок


Покинул форум
Сообщений всего: 13
Дата рег-ции: Авг. 2007  


Помог: 0 раз(а)




valenok пишет:
Но опять же, наверное вы придумали нелучший способ решения какойто задачи.
А на практике разбив строку вы не многое выиграли.
Вы выиграли лишь одну строку кода и немного времени.

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

    новым способом(при разбиении на столбцы)=0,01 сек.

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



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)




Наше дело предложить


-----
Truly yours, Sasha.
 
My status
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB