mysql - 如何创建按标签组织的数据库

标签 mysql database tags

我将创建一个数据库,其内容按标签组织。

我创建了两个表,一个称为“游戏”,另一个称为“平台”,并在表“游戏”中创建了一个名为“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)

WORKING EXAMPLE

<小时/>

显示为 HTML:

为了将数据输出为 HTML,请使用您使用的服务器端语言(我在这些示例中使用 PHP)执行数据库查询并生成适当的 HTML。选择您选择的 HTML 布局来显示数据(我使用的是表格)。

SQL 处理:

对于较小的数据集,您可以在数据库查询本身中执行一些处理。例如,您可以 concatenatecoalesce显示数据:

// 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`);";

WORKING EXAMPLE

然后将结果处理成数组:

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/

相关文章:

mysql - 这个符号是什么意思 := in sql

mysql - mysql 查询问题

mysql - 为来自两个不同表的两个外键声明外键约束

mysql - 是否可以在 phpmyadmin 中为外键约束添加条件?

android - 支持和反对 Android SQLite 使用的论点

tags - 使用通用 ctags 支持编译 GNU Global

sql - 有没有办法强制 Oracle 在不使用提示的情况下更改查询计划?

java - 如何在 Eclipse 中禁用右边距中的 TODO 标记注释?

mysql - Erlang MySQL : How to prevent SQL Injections

php - 在 prestashop DB 的表内复制