Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   Интересный запрос (помогите составить) Mysql (http://www.flasher.ru/forum/showthread.php?t=155014)

yo3o 26.04.2011 17:27

Интересный запрос (помогите составить) Mysql
 
я делаю игру и мне нужен очень интересный для меня запрос!

и так, у нас есть таблица fon
вот её структура
id|user1|user2|user3|user4|user5


мне нужен запрос который бы нашёл строку с ид 5 и проверил на заполненность user1,user2,user3,user4,user5 и в первую свободную записал бы цифру 1

incoob 26.04.2011 17:45

Проще (и правильнее) поменять структуру базы:
-у таблицы fon убрать столбцы user1|user2|user3|user4|user5
-создать таблицу fon_users со структурой
id|fon_id|user
-складывать в эту таблицу всех users

Если так хочется, чтобы обязательно было 5 users, то при вставке в fon можно добавить 5 записей в fon_users. Но это довольно коряво...

yo3o 26.04.2011 18:23

Цитата:

Сообщение от incoob (Сообщение 992288)
Проще (и правильнее) поменять структуру базы:
-у таблицы fon убрать столбцы user1|user2|user3|user4|user5
-создать таблицу fon_users со структурой
id|fon_id|user
-складывать в эту таблицу всех users

Если так хочется, чтобы обязательно было 5 users, то при вставке в fon можно добавить 5 записей в fon_users. Но это довольно коряво...

можете подсказать запрос под мой пример?

Добавлено через 3 часа 24 минуты
можете подсказать еще один запрос?
нужен почти такой-же только чтоб он выводил столько полей user свободных и сколько занятых.

Очень важный для меня момент!

Crazy 27.04.2011 00:07

Код:

update fon set
  user5 = if( isnull(user5) and not isnull(user4) and not isnull(user3) and not isnull(user2) and not isnull(user1), 1, user5),
  user4 = if( isnull(user4) and not isnull(user3) and not isnull(user2) and not isnull(user1), 1, user4),
  user3 = if( isnull(user3) and not isnull(user2) and not isnull(user1), 1, user3),
  user2 = if( isnull(user2) and not isnull(user1), 1, user2),
  user1 = ifnull(user1, 1)
where id = 5

Добавлено через 5 минут
Код:

select if(isnull(user1),0,1) +
      if(isnull(user2),0,1) +
      if(isnull(user3),0,1) +
      if(isnull(user4),0,1) +
      if(isnull(user5),0,1) as count
  from fon
  where id = 5


Gaen 29.04.2011 15:43

Если поля свободны, то зачем вообще хранить их в базе?
Имеем таблицы:
Код:

+-----------+
|backgrounds|
+-----------+
|id        |
+-----------+

+-----------------+
|backgrounds_users|
+-----------------+
|id_background    |
|id_user          |
+-----------------+

Каждая запись в таблице backgrounds_users привязывает пользователя к фону (не могу даже представить, зачем это нужно). При помощи дополнительных ухищрений типа ON INSERT, можно сразу наложить ограничения на уникальность пары (id_background, id_user) и на максимальное количество юзеров для одного фона. В этом случае запросы заметно упростятся.

Получение количества игроков, привязанных к фону %ID%:
Код:

SELECT count(id_user) FROM backgrounds_users WHERE id_background=%ID%;
Добавление игрока %USER% к фону %BACKGROUND%:
Код:

INSERT INTO backgrounds_users SET id_background=%BACKGROUND%, id_user=%USER%;


Часовой пояс GMT +4, время: 08:38.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.