Javascript-форум (https://javascript.ru/forum/)
-   Серверные языки и технологии (https://javascript.ru/forum/server/)
-   -   Логика сравнения таблиц mysql (https://javascript.ru/forum/server/26323-logika-sravneniya-tablic-mysql.html)

T-sh 04.03.2012 17:29

Логика сравнения таблиц 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 и каждый из них может создать по комнате, а то и по две). Нужно делать запрос со сравнением.. логику додумать не могу. Мозг отключается :(

Rootpassword 04.03.2012 17:36

where `type` = "forever" OR EXISTS(SELECT * FROM `sessions` условие )
это?

T-sh 04.03.2012 17:44

Цитата:

Сообщение от Rootpassword (Сообщение 161372)
where `type` = "forever" OR EXISTS(SELECT * FROM `sessions` условие )
это?

спасибо, вроде должно помочь в комплексе с group by :)

с базами две недели работаю только.. с составлением запросов туговато :(

Rootpassword 04.03.2012 17:46

group by тут не надо, у вас же нету аггрегатных функций.

T-sh 04.03.2012 17:49

Цитата:

Сообщение от Rootpassword (Сообщение 161375)
group by тут не надо, у вас же нету аггрегатных функций.

в "sessions" ведь будет куча повторяющихся значений "room", если в одной комнате будут несколько человек сидеть.

Rootpassword 04.03.2012 17:51

нет. у вас выборка же не по юзерам, а по комнатам. а прелесть exists в том и состоит, что она и будет искать максимум 1 юзера в комнате. Т.е. скорость.

T-sh 04.03.2012 17:52

Цитата:

Сообщение от Rootpassword (Сообщение 161377)
нет. у вас выборка же не по юзерам, а по комнатам. а прелесть exists в том и состоит, что она и будет искать максимум 1 юзера в комнате. Т.е. скорость.

спасибо ещё раз :)

Rootpassword 04.03.2012 17:54

SELECT * FROM `rooms` WHERE `rooms`.`type`="forever" OR EXISTS(SELECT * FROM `sessions` WHERE `sessions`.`room`=`rooms`.`id`)
типа того


Часовой пояс GMT +3, время: 12:09.