Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.03.2012, 17:29
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Логика сравнения таблиц mysql
Опять я в перегрузе.

Суть:

Веб-чат.
Есть комнаты постоянные (которые создал админ/модеры) и временные (которые создают пользователи). Есть таблица всех комнат + есть таблица пользователей online с названиями комнат, в которых они сейчас находятся.

Нужно получить одним запросом все постоянные комнаты + все временные, в которых есть хоть один пользователь. Либо наоборот, получить из временных те, где никого нет.

Две таблицы.

Первая "rooms"— "комнаты" чата:
id, room, type.

id = a_i.
room — название комнаты
type принимает значения "forever" или "time"

Вторая "sessions" — пользователи online:
id, name, lasttime, room

id = id сессии
name = имя юзера
lasttime = последняя активность
room = название комнаты, в которой находится.

Задача:
Взять из таблицы "rooms" только те комнаты, которые имеют type = "forever", и из оставшихся (с type = "time") только те, которые есть в таблице "sessions".

Делать два запроса и перебор очень долго (планируется >1000 пользователей online и каждый из них может создать по комнате, а то и по две). Нужно делать запрос со сравнением.. логику додумать не могу. Мозг отключается
__________________
С моих слов записано верно.
Ответить с цитированием
  #2 (permalink)  
Старый 04.03.2012, 17:36
Server
Отправить личное сообщение для Rootpassword Посмотреть профиль Найти все сообщения от Rootpassword
 
Регистрация: 26.09.2011
Сообщений: 252

where `type` = "forever" OR EXISTS(SELECT * FROM `sessions` условие )
это?
Ответить с цитированием
  #3 (permalink)  
Старый 04.03.2012, 17:44
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Сообщение от Rootpassword Посмотреть сообщение
where `type` = "forever" OR EXISTS(SELECT * FROM `sessions` условие )
это?
спасибо, вроде должно помочь в комплексе с group by

с базами две недели работаю только.. с составлением запросов туговато
__________________
С моих слов записано верно.
Ответить с цитированием
  #4 (permalink)  
Старый 04.03.2012, 17:46
Server
Отправить личное сообщение для Rootpassword Посмотреть профиль Найти все сообщения от Rootpassword
 
Регистрация: 26.09.2011
Сообщений: 252

group by тут не надо, у вас же нету аггрегатных функций.
Ответить с цитированием
  #5 (permalink)  
Старый 04.03.2012, 17:49
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Сообщение от Rootpassword Посмотреть сообщение
group by тут не надо, у вас же нету аггрегатных функций.
в "sessions" ведь будет куча повторяющихся значений "room", если в одной комнате будут несколько человек сидеть.
__________________
С моих слов записано верно.
Ответить с цитированием
  #6 (permalink)  
Старый 04.03.2012, 17:51
Server
Отправить личное сообщение для Rootpassword Посмотреть профиль Найти все сообщения от Rootpassword
 
Регистрация: 26.09.2011
Сообщений: 252

нет. у вас выборка же не по юзерам, а по комнатам. а прелесть exists в том и состоит, что она и будет искать максимум 1 юзера в комнате. Т.е. скорость.
Ответить с цитированием
  #7 (permalink)  
Старый 04.03.2012, 17:52
Аватар для T-sh
Профессор
Отправить личное сообщение для T-sh Посмотреть профиль Найти все сообщения от T-sh
 
Регистрация: 04.12.2009
Сообщений: 579

Сообщение от Rootpassword Посмотреть сообщение
нет. у вас выборка же не по юзерам, а по комнатам. а прелесть exists в том и состоит, что она и будет искать максимум 1 юзера в комнате. Т.е. скорость.
спасибо ещё раз
__________________
С моих слов записано верно.
Ответить с цитированием
  #8 (permalink)  
Старый 04.03.2012, 17:54
Server
Отправить личное сообщение для Rootpassword Посмотреть профиль Найти все сообщения от Rootpassword
 
Регистрация: 26.09.2011
Сообщений: 252

SELECT * FROM `rooms` WHERE `rooms`.`type`="forever" OR EXISTS(SELECT * FROM `sessions` WHERE `sessions`.`room`=`rooms`.`id`)
типа того
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скрипт создания таблиц в MySQL nyols Ваши сайты и скрипты 3 22.05.2011 21:18
Несколько одинаковых таблиц. Обращение к отдельным элементам в них. zaytsewa Элементы интерфейса 7 11.11.2010 09:08
удаленная MySQL mycoding Серверные языки и технологии 10 28.07.2010 15:12
Помогите с запросом ... MySQL Arfey Серверные языки и технологии 9 16.06.2010 12:55