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 :: SELECT * FROM

 PHP.SU

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


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

> Без описания
ant
Отправлено: 28 Июля, 2011 - 18:14:59
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


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




Есть таблица в MySQL. В ней есть такие колонки:
id, abc-1, abc-2, abc-3, ..., abc-20

Есть двумерный массив, например такой:


Грубо говоря:
$i - номер id
$j - номер колонки (abc-$j).

Возможно ли получить данные из таблицы одним запросом?

Понятно, что можно вытащить все в массив PHP, а затем в цикле обработать, но строк много и так получилось, что требования к экономии оперативной памяти высокие. Можно конечно частями вытаскивать и обрабатывать, но все же...
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Июля, 2011 - 19:06:32
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Сдается что что-то изначально организовано неверно...
Выбирать придется все колонки, зато не все id.
PHP:
скопировать код в буфер обмена
  1. $ids = array_keys($array);
  2. $cnt = count($ids);
  3. $in_id = "";
  4. for ($i = 0; $i < $cnt; $i++) {
  5.   $in_id .= ($i < $cnt) ? $ids[$i]."," : $ids[$i];
  6.   }
  7. $res = mysql_query("SELECT * FROM tbl WHERE id IN ($in_ids)");

Не проверял...
 
 Top
ant
Отправлено: 28 Июля, 2011 - 19:23:09
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


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




Хорошо, понял. Спасибо
 
 Top
DeepVarvar Супермодератор
Отправлено: 28 Июля, 2011 - 19:27:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




Подумал что можно не гонять пыха дважды по массиву,
переделал на один проход, так же на коленке без проверок,
однако и этот вариант имеет минусы с ненужным $val:
PHP:
скопировать код в буфер обмена
  1. $cnt = count($array);
  2. $in_id = "";
  3. $i = 0;
  4. foreach ($array as $key => $val) {
  5.   $in_id .= ($i < $cnt) ? "$key," : $key;
  6.   $i++;
  7.   }
  8. $res = mysql_query("SELECT * FROM tbl WHERE id IN ($in_id)");
 
 Top
OrmaJever
Отправлено: 28 Июля, 2011 - 20:03:52
Post Id



Активный участник


Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010  
Откуда: Чернигов


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




ant пишет:
Понятно, что можно вытащить все в массив PHP, а затем в цикле обработать, но строк много и так получилось, что требования к экономии оперативной памяти высокие.

Я немогу понять если требования к оперативной памяти высокие то зачем тогда создавать новый масив? может ещё и пару копий создать что бы наверняка? Вытаскивать даные и сразу с ними работать не создавая новых переменых или масивов.


-----
Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
 
 Top
ant
Отправлено: 29 Июля, 2011 - 06:30:29
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


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




OrmaJever пишет:
Я немогу понять если требования к оперативной памяти высокие то зачем тогда создавать новый масив? может ещё и пару копий создать что бы наверняка? Вытаскивать даные и сразу с ними работать не создавая новых переменых или масивов.

PHP:
скопировать код в буфер обмена
  1.   $query="SELECT * FROM table";
  2.   $result=mysql_query($query);
  3.   for ($i=1; $i<=mysql_num_rows($result); $i++)
  4.     $row[$i]=mysql_fetch_array($result);

В данном случае $row - это массив. Вы имеете ввиду, что можно обойтись без этого массива?
 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Июля, 2011 - 07:55:48
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


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




ant пишет:
можно обойтись без этого массива?
Да, можно, если правильно спроектировать БД.
Тогда можно обойтись одним запросом.
Понятно что не всегда.
Однако если вы опишите более подробно какие данные нужно хранить,
мы сможем помочь правильно спроектировать таблицы и связи.
 
 Top
ant
Отправлено: 29 Июля, 2011 - 09:34:19
Post Id



Частый гость


Покинул форум
Сообщений всего: 133
Дата рег-ции: Янв. 2011  
Откуда: Украина, Крым


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




DeepVarvar пишет:
Да, можно, если правильно спроектировать БД.
Тогда можно обойтись одним запросом.
Понятно что не всегда.
Однако если вы опишите более подробно какие данные нужно хранить,
мы сможем помочь правильно спроектировать таблицы и связи.

Как забрать нужные строки из таблицы одним запросом я знаю.

Я не понял вот этого:
OrmaJever пишет:
Вытаскивать даные и сразу с ними работать не создавая новых переменых или масивов.
 
 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