我将创建一个数据库,其内容按标签组织。
我创建了两个表,一个称为“游戏”,另一个称为“平台”,并在表“游戏”中创建了一个名为“plataforma_id”的列,以便能够调用特定平台,但有些游戏有多个平台,所以我知道如何在我的“游戏”表中调用两个或多个平台。
例如:
桌面游戏
id |平台_id |名称
1 | 1 |游戏1
2 | 2 |游戏1
*我想为游戏1调用多个平台
table 平台
id |姓名
1 |电脑
2 |苹果电脑
3 | Linux
最佳答案
Florent 是正确的,您需要通过第三个表建立“多对多”关系。任意数量的游戏可以匹配任意数量的平台。使用 JOIN 将三个表通过适当的关系链接在一起。
但是,我对您的架构有不同的想法:
CREATE TABLE IF NOT EXISTS `platforms` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `games` (
`id` mediumint(8) unsigned NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
);
CREATE TABLE IF NOT EXISTS `games_platforms` (
`game_id` mediumint(9) NOT NULL,
`platform_id` mediumint(9) NOT NULL,
UNIQUE KEY `unique pair` (`game_id`,`platform_id`)
);
鉴于以下数据:
INSERT INTO `platforms` (`id`, `name`) VALUES
(1, 'Platform 1'),
(2, 'Platform 2'),
(3, 'Platform 3');
INSERT INTO `games` (`id`, `name`) VALUES
(1, 'Game 1'),
(2, 'Game 2'),
(3, 'Game 3');
INSERT INTO `games_platforms` (`game_id`, `platform_id`) VALUES
(1, 1),
(1, 2),
(2, 1);
以及以下查询:
SELECT g.`name` as `game_name`, p.`name` as `platform_name`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`);
我们得到以下结果:
GAME_NAME PLATFORM_NAME
--------- -------------
Game 1 Platform 1
Game 1 Platform 2
Game 2 Platform 1
Game 3 (null)
<小时/>
显示为 HTML:
为了将数据输出为 HTML,请使用您使用的服务器端语言(我在这些示例中使用 PHP)执行数据库查询并生成适当的 HTML。选择您选择的 HTML 布局来显示数据(我使用的是表格)。
SQL 处理:
对于较小的数据集,您可以在数据库查询本身中执行一些处理。例如,您可以 concatenate和 coalesce显示数据:
// fetch platforms by game
$sql="SELECT
g.`name` as `game_name`,
GROUP_CONCAT(
COALESCE(p.`name`, 'n/a') ORDER BY p.`name` ASC SEPARATOR ', '
) as `platform_names`,
COUNT(p.`id`) as `platform_count`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`)
GROUP BY g.`id`
ORDER BY g.`name` ASC;";
我创建了a few examples of database queries HERE .
然后用 PHP 输出结果数据集:
...
// list platforms by game
?><table border="1">
<thead><tr><th>Game</th><th>Platforms</th></tr></thead>
<tbody><?php
while ($row=$q->fetch(PDO::FETCH_ASSOC)) {
?><tr>
<td><?=$row['game_name']?></td>
<td><?=$row['platform_names']?></td>
<td><?=$row['platform_count']?></td>
</tr><?php
}
?></tbody>
</table><?php
...
看起来像这样:
Game Platforms Platform Count
---- --------- --------------
Game 1 Platform 1, Platform 2, Platform 5 3
Game 2 Platform 1, Platform 3 2
Game 3 Platform 1, Platform 2, Platform 5 3
Game 4 Platform 2 1
Game 5 n/a 0
Game 6 Platform 1, Platform 5 2
这是一个WORKING EXAMPLE的。
PHP 处理:
在大型数据集上执行这样的查询可能太耗时。或者,您可能需要比数据库查询本身更严格地处理结果。如果是这种情况,您可能希望使用 PHP 进行处理,而不是使用数据库查询本身。
首先执行一个更一般的查询,如下所示:
// fetch platforms by game
$sql="SELECT g.`id` as `game_id`, g.`name` as `game_name`,
p.`id` as `platform_id`, p.`name` as `platform_name`
FROM `games` g
LEFT JOIN `games_platforms` gp ON (gp.`game_id`=g.`id`)
LEFT JOIN `platforms` p ON (p.`id`=gp.`platform_id`);";
然后将结果处理成数组:
while ($row=$q->fetch(PDO::FETCH_ASSOC)) {
// add this row's game to the array
$entries[$row['game_id']]['game']=array(
'id'=>$row['game_id'],
'name'=>$row['game_name']
);
// if there's a platform for this row, add it to the game entry
if ($row['platform_id']) {
$entries[$row['game_id']]['platforms'][]=array(
'id'=>$row['platform_id'],
'name'=>$row['platform_name']
);
}
}
然后将该数组输出到表中
(缩进稍微变平以节省空间):
?><table border="1">
<thead><tr><th>Game</th><th>Platforms</th><th>Platform Count</th></tr></thead>
<tbody><?php
foreach ($entries as $entry) {
?><tr>
<td><a href="#view_game.php?id=<?=$entry['game']['id']?>"><?=$entry['game']['name']?></a></td>
<td><?php
if (empty($entry['platforms'])) {
echo "n/a";
} else {
foreach ($entry['platforms'] as $platform) {
?><p><a href="#view_platform.php?id=<?=$platform['id']?>"><?=$platform['name']?></a></p><?php
}
}
?></td>
<td><?=!empty($entry['platforms'])?count($entry['platforms']):0?></td>
</tr><?php
}
?></tbody>
</table><?php
这样,您就可以生成一个可能更强大的数据表,包含游戏和平台以及其他功能的潜在链接。像这样的事情:
Game Platforms Platform Count
---- --------- --------------
Game 1 Platform 1 3
Platform 2
Platform 5
Game 2 Platform 1 2
Platform 3
Game 3 Platform 1 3
Platform 4
Platform 5
Game 4 Platform 2 1
Game 5 n/a 0
Game 6 Platform 1 2
Platform 5
这是一个WORKING EXAMPLE的。
这些只是您可以使用数据集做什么的一些想法和头脑 Storm 。数据库允许对数据进行一些非常有趣的操作,并且可能性似乎无穷无尽。
关于mysql - 如何创建按标签组织的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940459/