0

所以据我所知,mysql 中没有集合、列表、字典或数组。我想构建一个系统,它有两个核心组件,关于比赛的信息,然后是比赛中的角色列表。如果 mysql 中有列表,那么我会做这样的事情:

game_id INT,
characters list<varchar>,
....more data

我希望能够执行的基本查询是这样的:

SELECT * FROM games WHERE characters IN LIST(list);

我可能只选择一个字符,或者我可以指定 10 个字符。问题是如何在 mysql 中有效地做到这一点,而不是WHEREOR. 角色也没有特定的顺序……但我想我可以根据他们的 ID 对它们进行排序。

我想到的唯一方法是创建包含基本信息的第一个表和仅包含角色 id 和 game_id 的第二个表。

有人对如何使用我可能不知道的一些花哨的 mysql 技巧很好地组织这些数据有任何建议吗?查询也需要很快,因为最终可能会有很多。除非我添加查看/下载计数器,否则读取次数将多于写入次数......比我猜它的写入/更新次数要多于读取次数。

谢谢,我很乐意提供更多信息。

4

1 回答 1

2

如果我正确理解你的问题,我能想到两种方法......

方法 1 ... 添加一个game_characters看起来像 ...

CREATE TABLE `games_characters` (
  `game_id` int(11) DEFAULT NULL,
  `character_id` int(11) DEFAULT NULL,
  KEY `games` (`game_id`),
  KEY `characters` (`character_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

...那么查询将类似于...

SELECT *
FROM `games` as g
LEFT JOIN `games_characters` as gc
  ON (g.`id` = gc.`game_id`)
WHERE gc.`character_id` IN (12,52,86,23)

方法 2 ... 使用 LIKE,不太适合大型数据库,但避免了额外的表 ...characters记录将包含来自另一个表的一堆 id,characters用句点分隔,例如“.23.51.252.75.93”。 . 查询看起来像

SELECT *
FROM `games`
WHERE `characters` LIKE '%.23.%'
   OR `characters` LIKE '%.58.%'

您的 CMS 必须解析和重建字符串。

于 2013-01-23T04:17:06.180 回答