Задать вопрос
@Virtus_pro
PHP программист

Создание SQL запроса для поиска для одной колонки?

Здравствуйте.

Подскажите пожалуйста как решить проблему, а то все не как не пойму как сделать.

Есть таблица с игровыми серверами
CREATE TABLE  `servers` (
  `server_id` mediumint(5) unsigned NOT NULL,
  `server_game` varchar(100) DEFAULT NULL,
  `game_mod` text  (сюда пишутся ид модов, моды в другой таблице)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;


В ней есть столбцы интересующие нас: server_game и game_mod

На сайте есть поиск по игровым серверам.

Человек может выбрать игру любую, за это отвечает колонка server_game(тут находится тип игры)

В колонку server_game_mod помещаются моды сервера, но модов может быть и 50 и 100 (в таблице пишется ид мода)

Понятно что можно сделать WHERE server_game='ТИП ИГРЫ' AND game_mod='Моды игры'

Все бы понятно, но вот вопрос, столбец то один для модов так ? А модов очень много и если даже искать через LIKE, то могут повторяться название в модах и будут выдаваться поиском не нужные сервера.

Наглядно:
Человек ищет сервер minecraft, и выбрал моды "с PvP". (Все моды хранятся в другой таблице и в game_mod пишутся только id мода.
Запрос получается следующий
SELECT * FROM `servers` WHERE `server_game`='minecraft' AND `game_mod` LIKE '%6%'

Но это выдаст нам кучу других серверов, с учетом 16 ид .
Так же я понимаю, что я могу создать 100 столбцов в таблице, для каждого столбца свой мод, и просто уже в запросе писать чтобы выбирать по определеным столбцам моды, но хочется как то в одном столбце все

Как мне лучше реализовать поиск?
  • Вопрос задан
  • 247 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Niomin
Такую связь нужно делать через внешнюю таблицу. То есть ещё одна таблица, в которой будут server_id, mod_id.
Ответ написан
@Draconian
Oracle Developer
У вас получается, что на одном сервере может стоять много модов, но один мод может стоять на множестве серверов, т.е. связь "многие ко многим". В таких случаях делают таблицу связи.
CREATE TABLE  'servers' (
  'server_id' mediumint(5) unsigned NOT NULL,
  'server_game'  varchar(100) DEFAULT NULL,
  'game_mod' mediumint(10)
);

CREATE TABLE  'game_mods' (
  'mod_id' mediumint(5) unsigned NOT NULL,
  'mod_name' varchar(100) DEFAULT NULL,
  'is_pvp' integer(5) NOT NULL,
  ...
);

CREATE TABLE  'servers_game_mods' (
    'server_id' mediumint(5) unsigned NOT NULL,
    'game_mod_id' mediumint(5) unsigned NOT NULL
);

select * from servers s
    join servers_game_mods sgm on sgm.server_id = s.server_id
    join game_mods gm on gm.mod_id = sgm.game_mod_id
where s.server_game = 'minecraft' and gm.is_pvp = true;


Как-то так вроде бы. Остаётся только заполнить таблицу связи корректно (какие моды на каком сервере установлены).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы