我会创建一个数据库,其内容按标签组织。
我创建了两个表,一个名为“游戏”和其他“平台”,并在表“游戏”中创建了一个名为“plataforma_id”的列,以便能够调用特定平台,但有些游戏有多个平台,所以我知道如何在我的“游戏”表中调用两个或更多平台。
例如:
桌上游戏
id | platform_id |名字
1 | 1 |的Game1
2 | 2 |的Game1
*我想为game1调用多个平台
表格平台
id |名称
1 | PC
2 | MAC
3 | Linux的
答案 0 :(得分:1)
你想要的是A和B之间的多对多关系。这是通过第三个表A_B完成的,其中ID列来自A和B
桌上游戏
id |名字1 | 1 | game1 2 | 2 |的Game1
表格平台
id |名字1 | PC 2 | Mac 3 | Linux的
TABLE GAMES_PLATFORMS
id_game | id_platform
您需要JOIN
用于select
次查询
答案 1 :(得分:1)
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,请使用您正在使用的任何服务器端语言执行数据库查询(我在这些示例中使用PHP)并生成相应的HTML。选择您选择的HTML布局以显示数据(我正在使用表格)。
对于较小的数据集,您可以在数据库查询中执行一些处理。例如,您可以显示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
在大型数据集上执行类似的查询可能太费时间了。或者,您可能需要比数据库查询本身更严格地处理结果。如果是这种情况,您可能希望使用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
这些只是您可以对数据集做些什么的一些想法和头脑风暴。数据库允许一些非常有趣的数据操作,可能性似乎无穷无尽。