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 :: 2 запроса в одном

 PHP.SU

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


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

> Без описания
ridvik
Отправлено: 08 Июня, 2013 - 13:38:05
Post Id


Частый гость


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


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

[+]


Добрый день участникам портала. Столкнулся с проблемой, как решить не знаю( Нужно вывысти таблицу данных из бд, но вот в чем проблема:
Данные беру вот таким запросом:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $result = $main->db->sql_query("SELECT p.*, u.uid, u.user_name FROM ".TEAMS." as p JOIN ".USERS." as u ON (p.id_cl=u.uid)");

С ним все гуд, но проблема заключается в том, что в последнем столбце надо вывести число людей, которые онлайн в данный момент.
Если смотреть по отдельности, а не списком, то я это делаю вот таким запросом:
CODE (htmlphp):
скопировать код в буфер обмена
  1. $result = $main->db->sql_query("SELECT p.*, u.* FROM `".PLAYERS."` as p LEFT JOIN `".USERS."` as u ON (p.uid=u.uid) WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE) AND `tid`={$_GET['id']}");

Так вот теперь вроде как сам вопрос, как объединить эти два запроса, что бы выводились все записи и количество онлайн каждой???
 
 Top
biperch
Отправлено: 10 Июня, 2013 - 02:10:58
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 588
Дата рег-ции: Окт. 2009  
Откуда: Днепропетровск


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




CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT p.*, u.uid, u.user_name FROM ".TEAMS." AS p
  3. JOIN ".USERS." AS u ON (p.id_cl=u.uid)
  4. LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid) WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE) AND `tid`=12) pl N pl.tid = p.tid
  5.  
  6.  


примерно так, но это просто пример, только я полей не знаю и какой признак того что клиент онлан
 
 Top
ridvik
Отправлено: 10 Июня, 2013 - 07:56:19
Post Id


Частый гость


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


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

[+]


biperch пишет:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT p.*, u.uid, u.user_name FROM ".TEAMS." AS p
  3. JOIN ".USERS." AS u ON (p.id_cl=u.uid)
  4. LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid) WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE) AND `tid`=12) pl N pl.tid = p.tid
  5.  
  6.  


примерно так, но это просто пример, только я полей не знаю и какой признак того что клиент онлан


спасибо, днем попробую, а признак то что он онлайн это вот status_time`>NOW() - INTERVAL 5 MINUTE
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 13:41:39
Post Id


Частый гость


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


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

[+]


Что тут не так?
CODE (htmlphp):
скопировать код в буфер обмена
  1. SELECT t.*, u.* FROM ".TEAMS." AS t
  2. JOIN ".USERS." AS u ON (t.id_cl=u.uid)
  3. LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p
  4. LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid)
  5. WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE)
  6. AND `tid`=12) pl ON (pl.tid = t.tid)


выходит вот такая ошибка: Duplicate column name 'uid':
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 13:50:52
Post Id


Профессионал


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


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




ridvik
Потому что не указано, из какой таблицы брать поле. При выборке всех полей (через знак *) в подзапросе неясно, какую из них возвращать во внешний запрос, поскольку указанное в ошибке поле присутствует более чем в 1-й таблице. Укажите явно.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 15:35:33
Post Id


Частый гость


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


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

[+]


EuGen пишет:
ridvik
Потому что не указано, из какой таблицы брать поле. При выборке всех полей (через знак *) в подзапросе неясно, какую из них возвращать во внешний запрос, поскольку указанное в ошибке поле присутствует более чем в 1-й таблице. Укажите явно.


не совсем вас понял(( не могли бы сами подставить и потом мне указать?
CODE (htmlphp):
скопировать код в буфер обмена
  1. function teams_list () {
  2. global $main, $tpl_create;
  3. /*echo "<select onchange='ajax_obj(this.value);'>
  4.                 <option value='0'>Все</option>
  5.                 <option value='1'>1 класс</option>
  6.                 <option value='2'>2 класс</option>
  7. </select>
  8. <div id='ajax_obj'></div>
  9. <div id='ajax_obj2'>";*/
  10. echo "";
  11. $result = $main->db->sql_query("SELECT p.*, u.uid, u.user_name FROM ".TEAMS." as p JOIN ".USERS." as u ON (p.id_cl=u.uid)");
  12. /*$result = $main->db->sql_query("SELECT t.*, u.* FROM ".TEAMS." AS t
  13. JOIN ".USERS." AS u ON (t.id_cl=u.uid)
  14. LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p
  15. LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid)
  16. WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE)
  17. AND `tid`=12) pl ON (pl.tid = t.tid)");*/
  18. open();
  19. $i=1;
  20. $row = "row1";
  21. echo "<table cellspacing='1' class='table3' width='100%'><tr align='center'><td width='20px' align='center'><b>#</b></td><td class='tour'>{$main->lang['name']}</td><td class='tour'>{$main->lang['manager']}</td><td class='tour'>{$main->lang['reg_team2']}</td><td class='tour'>{$main->lang['level']}</td><td class='tour'>{$main->lang['rating']}</td><td class='tour'></td></tr>";
  22. while ($r = $main->db->sql_fetchrow($result)){
  23. echo "<tr class='{$row}' align='center'>
  24. <td width='20px' align='center'>{$i}</td>
  25. <td class='tour2'><a href='".$main->url(array("module" => $_GET['module'], "do" => "view", "id" => $r['id']))."'>{$r['name']}</a></td>
  26. <td class='tour2'><a href='index.php?module=account&do=user&id={$r['id_cl']}' id='userinfo_{$row['id_cl']}' class='user_info'>{$r['user_name']}</a></td>
  27. <td class='tour2'>".user_format_date($r['date_reg'])."</td>
  28. <td class='tour2'>{$r['level']}</td>
  29. <td class='tour2'></td>
  30. <td class='tour2'></td></tr>";
  31. $row = ($row=="row1") ? "row2" : "row1";
  32. $i++;
  33. }
  34. echo "</table>";
  35. close();
  36. echo "</div>
  37. <script type='text/javascript'>
  38. function getXmlHttp(){
  39.  var xmlhttp;
  40.  try {
  41.    xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
  42.  } catch (e) {
  43.    try {
  44.      xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
  45.    } catch (E) {
  46.      xmlhttp = false;
  47.    }
  48.  }
  49.  if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
  50.    xmlhttp = new XMLHttpRequest();
  51.  }
  52.  return xmlhttp;
  53. }
  54.  
  55. // javascript-код голосования из примера
  56. function ajax_obj(value) {
  57.        // создать объект для запроса к серверу
  58.        var req = getXmlHttp()
  59.        req.onreadystatechange = function() {
  60.        // onreadystatechange активируется при получении ответа сервера
  61.                if (req.readyState == 4) {
  62.                // если запрос закончил выполняться
  63.                        if(req.status == 200) {
  64.                                // если статус 200 (ОК) - выдать ответ пользователю
  65.                                document.getElementById('ajax_obj').innerHTML = req.responseText;
  66.                                                                 document.getElementById('ajax_obj2').innerHTML = '';
  67.                        }
  68.                        // тут можно добавить else с обработкой ошибок запроса
  69.                }
  70.        }
  71.  
  72.    // задать адрес подключения
  73.        req.open('GET', 'ajax.php?do=teams&obj=' + value, true);
  74.  
  75.        // объект запроса подготовлен: указан адрес и создана функция onreadystatechange
  76.        // для обработки ответа сервера
  77.        req.send(null);  // отослать запрос
  78. }
  79. </script>";
  80. }


Вот собственно весь код, в последнем столбике хотелось бы выводить колличество онлайн, т.е. по условию WHERE (`status_time`>NOW() - INTERVAL 5 MINUTE)
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 16:39:11
Post Id


Профессионал


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


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




ridvik пишет:
LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p
LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid)

Вот Ваш подзапрос. в таблицах с альясами p и u присутствует одинаковое поле по названию (а именно uid) потому СУБД не может определить, из какой таблицы возвращать это поле в основной запрос. Подставить я ничего не могу, так как я, как и СУБД, не могу догадываться, из какой таблицы Вам это поле нужно. На первый взгляд подойдёт из любой.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 17:48:09
Post Id


Частый гость


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


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

[+]


EuGen пишет:
ridvik пишет:
LEFT JOIN (SELECT p.*, u.* FROM `".PLAYERS."` AS p
LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid)

Вот Ваш подзапрос. в таблицах с альясами p и u присутствует одинаковое поле по названию (а именно uid) потому СУБД не может определить, из какой таблицы возвращать это поле в основной запрос. Подставить я ничего не могу, так как я, как и СУБД, не могу догадываться, из какой таблицы Вам это поле нужно. На первый взгляд подойдёт из любой.


так, ну это я понял. а как же мне тогда выводить то значение?)) извините меня, но что-то реально туплю(((
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 17:49:37
Post Id


Профессионал


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


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




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


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 18:02:09
Post Id


Частый гость


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


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

[+]


EuGen пишет:
Перечислением полей вместо указания * при выборке, очевидно. При этом в списке указать поле uid только из одной таблицы, той, из которой нужно по логике Вашего запроса.


так он у меня в обоих таблицах, я так поле назвал, что бы не путаться))) что же теперь делать?))) правда, туплю и не пойму что и как)))
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 18:16:11
Post Id


Профессионал


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


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




Вот и укажите в подзапросе из какой таблицы выбираете, то есть p.uid или u.uid


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 18:51:47
Post Id


Частый гость


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


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

[+]


EuGen пишет:
Вот и укажите в подзапросе из какой таблицы выбираете, то есть p.uid или u.uid



как?))))
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 19:03:46
Post Id


Профессионал


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


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




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT some_table.a,some_table.b,some_table.c FROM some_table

-незнакомый синтаксис? Почитайте про синтаксис SQL


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
ridvik
Отправлено: 14 Июня, 2013 - 19:23:37
Post Id


Частый гость


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


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

[+]


Т.е. в подзапросе не надо делать LEFT JOIN?)
 
 Top
EuGen Администратор
Отправлено: 14 Июня, 2013 - 19:30:21
Post Id


Профессионал


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


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




Мне правда кажется, что Вы шутите. Ну да ладно, я довольно много усилий приложил, чтобы Вы написали запрос
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT p.field0, p.field1, u.field3, u.field4.* FROM `".PLAYERS."` AS p
  2. LEFT JOIN `".USERS."` AS u ON (p.uid=u.uid)

- синтаксис таков. При этом среди field0, field1, .. не должно встречаться полей с одинаковыми названиями, то есть поле можно выбрать только из одной таблицы - либо же, если необходимо из обеих, требуется определить разные альясы.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB