首頁  >  文章  >  資料庫  >  我可以在不使用外部語言的情況下加入 MySQL 欄位中的 \';\' 分隔值嗎?

我可以在不使用外部語言的情況下加入 MySQL 欄位中的 \';\' 分隔值嗎?

Susan Sarandon
Susan Sarandon原創
2024-10-31 12:56:02724瀏覽

Can I Join on ';' Separated Values in a MySQL Column Without Using External Languages?

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

當您的資料分佈在多個表中並且需要在單一查詢中檢索它而不使用PHP 等外部語言時,就會出現此問題。資料以非規範化方式存儲,單一列中的多個值以分號 (;) 分隔。

問題描述:

在本例中, user_resource表有資源列,其中包含以分號分隔的資源ID 清單:

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

期望結果:

期望結果是獲得一個列出了以下內容的表:每個用戶和相應的資源:

user data
user1 data1
user1 data2
user1 data4
user2 data2

解:

解決方案涉及從user_resource 表建立一個「規範化」表,處理資源ID 清單作為行,並將規範化表與資源表連接起來。這種「標準化」是使用 COUNT_IN_SET 和 VALUE_IN_SET 函數的組合來實現的。

標準化表:

生成的“標準化”表將類似於以下內容:

user resources resources_index resources_value
sampleuser 1;2;3 1 1
sampleuser 1;2;3 2 2
sampleuser 1;2;3 3 3
stacky 2 1 2
testuser 1;3 1 1
testuser 1;3 2 3

最終查詢:

<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>

使用的函數:

COUNT_IN_SET 且VALUE_IN_SET 函數的使用如下:

  • :傳回給定列中字元分隔項的計數。
  • VALUE_IN_SET
  • :將分隔清單視為基於一的陣列並傳回特定「索引」處的值。
其他資訊:

integerseries 表是包含從 1 到特定限制的數字,用於產生「標準化」行。
  • 此解決方案提供了一種通用方法來處理 MySQL 列中的分隔清單項,而不僅僅是在提供的特定範例的上下文中.

以上是我可以在不使用外部語言的情況下加入 MySQL 欄位中的 \';\' 分隔值嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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