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 :: Помогите оптимизировать sql выборку

 PHP.SU

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


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

> Без описания
diselvin2016
Отправлено: 30 Декабря, 2016 - 14:51:23
Post Id


Новичок


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


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




Всем доброго дня. Для выборки из таблицы случайной записи, набрасал код ниже. Есть 2 таблицы: table1 и table2. В table1 - множество str(записей), из неё, в зависимости от IP обратившегося, необходимо выводить случайную запись(str) лишь один раз. Т.е. одна и таже, для конкретного IP выводиться не должна! В table2 - сохраняются все ранее выведенные из table1 записи. Из неё выбираются все id'ы ранее выведенных для определённого IP и исключаются из sql условия. Код собственно работает. Но вот в оптимизации я не дальновиден. Всё ли на Ваш взгляд корректно? Спасибо за внимание Улыбка =)
PHP:
скопировать код в буфер обмена
  1.  
  2. <?PHP
  3. $cnnect = mysql_connect('localhost', 'root', 'PaSSwOD');
  4. mysql_select_db('dbase');
  5.  
  6. $code = mysql_query("SELECT id FROM table2 WHERE IP='".$_SERVER["REMOTE_ADDR"]."'");
  7. $id = array();
  8.  
  9. while($rows = mysql_fetch_row($code)){
  10. $id[] = $rows[0];
  11. }
  12.  
  13. if (!empty($id)){
  14. $query = "SELECT id,str FROM table1 WHERE id NOT IN ( '" . implode($id, "', '") . "' ) ORDER BY RAND() LIMIT 1";
  15. }
  16. else
  17. {
  18. $query = 'SELECT id,str FROM table1 ORDER BY RAND() LIMIT 1';
  19. }
  20. $result = mysql_query($query);
  21.  
  22. if ($result) {
  23.   $per = mysql_fetch_array($result);
  24.   if (!empty($per['str'])) {
  25.  mysql_query("INSERT INTO table2 (id,ip,str,time) VALUES('".$per['id']."','".$_SERVER["REMOTE_ADDR"]."', '".$per['str']."', NOW());");
  26.   }
  27.  
  28. }
  29.  
  30.  
  31. mysql_close($cnnect);
  32. ?>
  33.  
 
 Top
igosja
Отправлено: 07 Января, 2017 - 21:47:31
Post Id



Гость


Покинул форум
Сообщений всего: 77
Дата рег-ции: Март 2013  
Откуда: https://vhol.org


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




Можно убрать перебор цикла сделав вложенный запрос:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $cnnect = mysql_connect('localhost', 'root', 'PaSSwOD');
  3. mysql_select_db('dbase');
  4.  
  5. $query = "SELECT id,str
  6.           FROM table1
  7.           WHERE id NOT IN
  8.           (
  9.             SELECT id
  10.             FROM table2
  11.             WHERE IP='".$_SERVER["REMOTE_ADDR"]."'
  12.           )
  13.           ORDER BY RAND()
  14.           LIMIT 1";
  15. $result = mysql_query($query);
  16.  
  17. if ($result) {
  18.   $per = mysql_fetch_array($result);
  19.   if (!empty($per['str'])) {
  20.     mysql_query("INSERT INTO table2
  21.                  id='".$per['id']."',
  22.                  ip='".$_SERVER["REMOTE_ADDR"]."',
  23.                  str='".$per['str']."',
  24.                  time=NOW()");
  25.   }
  26. }
  27.  
  28.  
  29. mysql_close($cnnect);
 
 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