Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 描述此实体拥有列表中哪些项的列_Mysql - Fatal编程技术网

Mysql 描述此实体拥有列表中哪些项的列

Mysql 描述此实体拥有列表中哪些项的列,mysql,Mysql,我正在创建一个mysql数据库,我有一个表user,其中有一个名为成就的字段,我想在其中设置该用户解锁的成就 它类似于一个数组,其中size=成就数和'true'位于用户拥有此成就的位置。我想在mysql中不可能这样做,那么您有什么建议?我可能会使用3个表来实现这一点,其中1个是连接表: +--------+ +---------------+ +------------------+ | User | | Achievement | | User_Achieve

我正在创建一个mysql数据库,我有一个表
user
,其中有一个名为
成就
的字段,我想在其中设置该用户解锁的成就


它类似于一个数组,其中
size=成就数
'true'
位于用户拥有此成就的位置。我想在mysql中不可能这样做,那么您有什么建议?

我可能会使用3个表来实现这一点,其中1个是连接表:

+--------+ +---------------+ +------------------+ | User | | Achievement | | User_Achievement | +--------+ +---------------+ +------------------+ | UserID | | AchievementID | | UserID | +--------+ +---------------+ | AchievementID | +------------------+
因此,在本例中,Alice有两项成就,Bob有3项,Carol有0项。

如果您将此列仅用于在应用程序(如网页)中显示,则可以将数据存储为字符串,然后将其转换为所需的显示,甚至直接转换为数组(例如在PHP中):

但是,如果您打算在关系数据模型中使用此数据作为信息(例如,搜索具有选项c1=true和c3=false的所有记录,或计算具有选项c3=true的所有记录…),最好的替代方法是使用派生表,并使用数字而不是字符串:

CREATE TABLE users (userid INT, username VARCHAR(100));
CREATE TABLE options (userid INT, achievementkey CHAR(2), achievementval TINYINT);

INSERT INTO users (userid, username) VALUES 
(1, 'Mary'), 
(2, 'Sophia'),
(3, 'Margot');

INSERT INTO options (userid, achievementkey, achievementval) VALUES 
(1, 'c1', 1), 
(1, 'c2', 0), 
(1, 'c3', 1), 
(2, 'c1', 1), 
(2, 'c2', 0), 
(2, 'c3', 1), 
(3, 'c1', 0), 
(3, 'c2', 0), 
(3, 'c3', 1);
这样,您就有了一个理想的模型来查询所有用户的成就,或者进行聚合(总和、计数、平均值等)

CREATE TABLE users (userid INT, username VARCHAR(100), achievements VARCHAR(255));

INSERT INTO users (userid, username, achievements) VALUES 
(1, 'Mary', 'c1=>true,c2=>false,c3=>false,c4=>true'), 
(2, 'Sophia', 'c1=>false,c2=>true,c3=>true,c4=>true'),
(3, 'Margot', 'c1=>true,c2=>false,c3=>false,c4=>true');
CREATE TABLE users (userid INT, username VARCHAR(100));
CREATE TABLE options (userid INT, achievementkey CHAR(2), achievementval TINYINT);

INSERT INTO users (userid, username) VALUES 
(1, 'Mary'), 
(2, 'Sophia'),
(3, 'Margot');

INSERT INTO options (userid, achievementkey, achievementval) VALUES 
(1, 'c1', 1), 
(1, 'c2', 0), 
(1, 'c3', 1), 
(2, 'c1', 1), 
(2, 'c2', 0), 
(2, 'c3', 1), 
(3, 'c1', 0), 
(3, 'c2', 0), 
(3, 'c3', 1);