首页 > 解决方案 > 以逗号分隔的字符串拆分并在 MySQL 和 PHP 中显示

问题描述

我有一个小型数据库:

+-----------+-----------+------------------------+
| Name      | Number    |   Hobby                | 
+-----------+-----------+------------------------+
| Alex      | 2, 3      | Game, Shopping         |
+-----------+------------------------------------+

这意味着数字 2 是游戏,数字 3 是购物。我怎样才能像这张表一样显示上面的数据

+-----------+-----------+
| 2         | Game      |
+-----------+-----------+
| 3         | Shopping  |
+-----------+------------

标签: phpmysql

解决方案


您的数据库未标准化。您需要第三个表,它通常称为连接表。

The people table. The primary key is id

+-----------+-----------+
| Id        | Name      |
+-----------+-----------+
| 1         | Alex      |
| 2         | Thor      |
| 3         | Iron Man  |
| 4         | Dr Stange |
| 5         | Thanos    |
+-----------+------------

The hobbies Table

+-----------+-----------+
| Id        | Name      |
+-----------+-----------+
| 1         | Game      |
| 2         | Shopping  |
| 3         | Fighting  |
+-----------+-----------+


Join table called (for example) people_hobbies

+-----------+-----------+
| person_id | hobby_id  |
+-----------+-----------+
| 1         | 1         |
| 1         | 2         |
+-----------+-----------+

这个 people_hobbies 表将使用 person_id 和 hobby_id 创建一个多字段主键。这将确保您将无法两次添加相同的组合......这甚至没有意义。

person_id 是一个外键,它引用了 people 表中的 id。hobby_id 是一个外键,它引用 hobbies 表中的 id。

拥有外键可以让您避免在 people_hobbies 表中有一个在 people 和 hobbies 表中都不存在的键。

下表中的示例显示人员 id 1 有两个爱好(1 和 2)。对于人类来说,亚历克斯的爱好是游戏和购物。

上述结构将让您以大多数人的方式管理您的数据库。

请记住以下几点:

  1. 在 people_hobbies 存在于 people 和 hobbies 表之前,您不能在它们中添加任何内容
  2. 您必须对外键定义进行 CASCADE UPDATE 和 CASCADE DELETE,以便当您从表中删除人员或爱好时,它会从 people_hobbies 表中删除关系。

推荐阅读