Bolehkah saya Menyelesaikan Ini dengan MySQL Tulen? (Menyertai pada ';' Nilai Terpisah dalam Lajur)
Soalan ini timbul apabila anda mempunyai data yang tersebar merentas berbilang jadual dan perlu mendapatkannya dalam satu pertanyaan tanpa menggunakan bahasa luaran seperti PHP. Data disimpan dalam cara yang tidak normal, dengan berbilang nilai dalam satu lajur yang dipisahkan dengan koma bertitik (;).
Perihalan Masalah:
Dalam kes ini, sumber_pengguna jadual mempunyai lajur sumber yang mengandungi senarai ID sumber yang dipisahkan oleh koma bertitik:
user | resources |
---|---|
user1 | 1;2;4 |
user2 | 2 |
user3 | 3;4 |
Keputusan yang Diingini:
Hasil yang diingini adalah untuk mendapatkan jadual yang menyenaraikan setiap pengguna dan sumber yang sepadan:
user | data |
---|---|
user1 | data1 |
user1 | data2 |
user1 | data4 |
user2 | data2 |
Penyelesaian:
Penyelesaian melibatkan mencipta jadual 'dinormalkan' daripada jadual user_resource, merawat senarai ID sumber sebagai baris, dan menyertai jadual ternormal dengan jadual sumber. 'Penormalan' ini dicapai menggunakan gabungan fungsi COUNT_IN_SET dan VALUE_IN_SET.
Jadual Dinormalisasi:
Jadual 'dinormalkan' yang dijana akan menyerupai yang berikut:
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 |
Pertanyaan Akhir:
<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>
Fungsi Digunakan:
Fungsi COUNT_IN_SET dan VALUE_IN_SET digunakan seperti berikut:
Maklumat Tambahan:
Atas ialah kandungan terperinci Bolehkah saya Sertai pada \';\' Nilai Terpisah dalam Lajur MySQL Tanpa Menggunakan Bahasa Luaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!