簡體   English   中英

拆分為逗號分隔的字符串,並在MySQL和PHP中顯示

[英]Split in comma-separated string and show in MySQL and PHP

我有一個小型數據庫:

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

這意味着2號是游戲,3號是購物。 我如何顯示上述數據

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

您的數據庫未規范化。 您需要第三個表,通常稱為聯接表。

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是一個外鍵,它引用了人員表中的ID。 hobby_id是一個外鍵,它引用了愛好表中的ID。

具有外鍵將使您避免在people_hobbies表中都不存在的people_hobbies表中具有鍵。

下表中的示例顯示,人ID為1的人有兩個愛好(1和2)。 對於人類而言,這意味着Alex的愛好是游戲和購物。

上面的結構使您可以像大多數人一樣管理數據庫。

請記住以下幾點:

  1. 您無法在people_hobbies中添加任何內容,然后再將其同時存在於people和hobbyies表中
  2. 您必須對外鍵定義具有CASCADE UPDATE和CASCADE DELETE,以便從表中刪除一個人或一個愛好時,它將從people_hobbies表中刪除該關系。
SELECT * FROM ints;
+---+
| i |
+---+
| 0 |
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
+---+

SELECT * FROM bad_schema;
+------+--------+----------------+
| name | number | hobby          |
+------+--------+----------------+
| Alex | 2, 3   | Game, Shopping |
+------+--------+----------------+

CREATE TABLE better_schema AS
SELECT DISTINCT name
              , SUBSTRING_INDEX(SUBSTRING_INDEX(number,',',i+1),',',-1) + 0 number
              , TRIM(SUBSTRING_INDEX(SUBSTRING_INDEX(hobby,',',i+1),',',-1)) hobby
           FROM bad_schema
              , ints;


SELECT * FROM better_schema;
+------+--------+----------+
| name | number | hobby    |
+------+--------+----------+
| Alex |      2 | Game     |
| Alex |      3 | Shopping |
+------+--------+----------+

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM