2016-04-27 3 views
0

Привет Я не уверен, как даже сформулировать этот вопрос, но я постараюсь изо всех сил.SQL один столбец несколько значений

У меня есть таблица, называемая играми, в этой таблице есть 3 столбца, ID (INT), epoch (INT) и пользователи (TEXT), теперь в каждом столбце пользователя есть значения от 4 до 25 значений, разделенных запятой , значения от 1 до 6 символов, так, например:

ID, EPOCH, USERS 

1, 1461779167, (123, 58234, 548245, 225122) 
2, 1461774823, (326784, 54235, 6373, 3566, 384174) 
3, 1461773423, (326784, 542355, 234, 351) 

Теперь моя проблема мне нужно fetech только среди пользователей, скажем, мне нужно получить «пользователь» 54235, он не может быть СОДЕРЖИТ потому что он столкнется с 542355, так что мне делать? Как правильно расположить эти столбцы, чтобы избежать таких ситуаций или упростить его вообще?

+0

mySQL [find_In_set] (http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set) function .. 'SELECT * from table WHERE FIND_IN_SET (' 54235 ', пользователи)> 1'; Хотя на самом деле нельзя хранить данные таким образом, поскольку они не нормализованы. – xQbert

+0

@xQbert Спасибо, каким образом он должен быть сохранен тогда? Я думал о лучшем решении – Theiq

+0

У вас действительно есть круглые скобки вокруг списка в столбце 'USERS'? Это предотвратит работу FIND_IN_SET. Кроме того, у них не должно быть пробелов между запятыми. – Barmar

ответ

1

«Правильное расположение» этих столбцов требует некоторой нормализации.

Вы могли бы иметь вторую таблицу под названием что-то вроде «player_games», который состоит из:

Столбцы идентификатора, игры, плеер

Затем связать пользователя с игрой, вставив в player_games.

Таким образом, если игрок 2 связан с игрой 5, вы делаете:

INSERT INTO player_games (game, player) VALUES (5, 2); 

И затем, если вам нужно получить все игры, связанные с игроком 2:

SELECT game FROM player_games WHERE player = 2; 

И если вам нужно чтобы получить все игроки, связанные с игрой 5:

SELECT player FROM player_games WHERE game = 5; 
+0

Но для этого потребуется гораздо больше запросов sql, не так ли? В основном то, что я делаю здесь, это выбор «журнала» игры и сохранение всех пользователей, участвовавших в этой конкретной игре, если я должен сделать запрос для каждого игрока, не будет ли это пустой тратой ресурсов? – Theiq

+0

К счастью, базы данных SQL надежны и оптимизированы для таких ситуаций :) При правильной индексации вы действительно не должны сталкиваться с проблемами производительности. Я уверен, что рассмотрение существующего столбца TEXT происходит намного медленнее, чем запрос отдельной, нормализованной таблицы. –

0

простейший хак вы можете сделать это вместо соответствия «54235» вы можете матч «54235». матч-запятая, и она будет делать трюк. убедитесь, что расположение запятой столбцов является правильным.

но это неправильный способ сохранить результаты. у вас должна быть таблица для сопоставления.

+0

тогда для ex. 17195, все равно будет соответствовать 117195, – Theiq

+0

, чем поиск по ", 17195," – kanchan

+0

@kanchan Это не сработает, если '17195' - это первый или последний элемент в списке. – Barmar

Смежные вопросы