MySQL列有多种选择?

时间:2014-01-21 16:44:57

标签: mysql sql

我想知道,因为我是新手使用MySQL,如果实际上有一种方法可以在一个表上有一个以上的选项,同时选择多个选项。 假设我正在创建一个视频游戏桌,并且某些标题可以在多个平台上使用(PC,PS3,XBox等),有没有办法让桌面上有一个名为platform的列,并有可能选择更多比其中一个选项? 编辑:我已经尝试使用ENUM但除非我忽略了一些我不能选择使用它的多个选项。 谢谢

5 个答案:

答案 0 :(得分:2)

TABLE Game (GameID, GameName, ...)
TABLE Platform (PlatformID, PlatformName, ...)
TABLE GamePlatform (GameID, PlatformID)

如果游戏#1在平台#2,#3和#7上可用,您将在表GamePlatform中记录三条记录:

INSERT INTO GamePlatform(GameID, PlatformID) VALUES (1, 2), (1, 3), (1, 7)

答案 1 :(得分:1)

您可以使用SET指定可以合并的值列表。

但是,这通常被认为是糟糕的表设计,因为很难连接使用多值列的表。对多对多关系使用关系表通常更好。研究数据库规范化以了解更多相关信息。

答案 2 :(得分:1)

有一个解决方法。这里的缺点是你必须为此添加一个新表。

第一步:为所有控制台类型创建一个表console

id | name
---------
1  |  PS3
2  |  Xbox
3  |  Wii

以及可以对其进行分组的表格。假设游戏id1是Mario Kart。你可以在PS3和Xbox上播放它。然后你有下一个。

id | gameId | consoleId
------------------------
1  |   1    |    2
2  |   1    |    1

其中gameIdgame表的FK,而consoleIdconsole表的FK。 第一列id是可选的(不是必需的)。

答案 3 :(得分:0)

您甚至可以创建varchar类型字段并存储由commans(1,2,5,8)分隔的数字,并将其映射到实际的平台名称。然后你可以使用mysql的FIND_IN_SET来匹配特定的数字,比如Comma separated value search in mysql

当你的桌子变得很大和/或想要一个合适的桌面设计时,如果你关心性能,那么使用它。

答案 4 :(得分:0)

可以在列中添加多个选项,但这样做有一个缺点,因为您需要找到值的长度并使用INSTR()和/或SUBSTR()来查找位置(这是单调乏味,一路上可能存在问题)

更好的解决方案是使用联结表,多对多(m:n),方法是将Game_ID和Platform_ID设置为自己表中的主键。