首頁  >  文章  >  資料庫  >  MySQL 中可以根據分號分隔的值連接表嗎?

MySQL 中可以根據分號分隔的值連接表嗎?

Barbara Streisand
Barbara Streisand原創
2024-11-01 00:03:28939瀏覽

Can I Join Tables in MySQL Based on Values Separated by Semicolons?

我可以用純 MySQL 解決這個問題嗎? (加入列中的「;」分隔值)

問題:

我在多個表中有數據,需要根據「;」加入(分號)列中的分隔值。我無法使用 PHP 或任何其他語言來操縱結果。有沒有辦法僅使用 MySQL 來實現此目的?

答案:

是的,可以透過 ';' 加入使用純 MySQL 在欄位中分隔值。以下是解決方案的詳細說明:

將分隔字串轉換為行

關鍵是轉換 ';'將分隔字串分成一系列行。這可以透過以下步驟來實現:

  1. 建立一個名為 integerseries 的表,其中包含從 1 到分隔字串中最大項目數的數字。
  2. 使用 COUNT_IN_SET 和 VALUE_IN_SET函數用於計算分隔字串中的項目數並根據其位置提取每個項目。
  3. 使用交叉連接將 user_resource 表與 integerseries 表連在一起。這將為分隔字串中的每個項目產生行。

規範化User_resource 表的查詢

<code class="sql">SELECT user_resource.user, 
       user_resource.resources,
       COUNT_IN_SET(user_resource.resources, ';') AS resources_count, 
       isequence.id AS resources_index,
       VALUE_IN_SET(user_resource.resources, ';', isequence.id) AS resources_value
FROM 
     user_resource 
     JOIN  integerseries AS isequence 
       ON  isequence.id <= COUNT_IN_SET(user_resource.resources, ';')
ORDER BY
       user_resource.user, isequence.id</code>

將規範化表與標準化資源表

範例輸入與輸出
<code class="sql">SELECT user_resource.user, 
       resource.data

FROM user_resource 
     JOIN integerseries AS isequence 
       ON isequence.id <= COUNT_IN_SET(user_resource.resources, ';')

     JOIN resource 
       ON resource.id = VALUE_IN_SET(user_resource.resources, ';', isequence.id)      
ORDER BY
       user_resource.user,  resource.data</code>

user_resource 表:

資料表:

user resources
user1 1;2;4
user2 2
user3 3;4

id data
1 data1
2 data2
3 data3
4 data4
5 data5

標準化user_resource 表:

user resources resources_count resources_index resources_value
user1 1;2;4 3 1 1
user1 1;2;4 3 2 2
user1 1;2;4 3 3 4
user2 2 1 1 2
user3 3;4 2 1 3
user3 3;4 2 2 4

輸出(連接結果):

user data
user1 data1
user1 data2
user1 data4
user2 data2

以上是MySQL 中可以根據分號分隔的值連接表嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn