


Bolehkah saya Menyertai Jadual dalam MySQL Berdasarkan Nilai yang Dipisahkan oleh Titik Bertitik?
Nov 01, 2024 am 12:03 AMBolehkah saya Menyelesaikan Ini dengan MySQL Tulen? (Menyertai pada ';' Nilai Terpisah dalam Lajur)
Soalan:
Saya mempunyai data dalam berbilang jadual yang perlu saya sertai berdasarkan ';' (titik bertitik) memisahkan nilai dalam lajur. Saya tidak boleh menggunakan PHP atau mana-mana bahasa lain untuk memanipulasi keputusan. Adakah terdapat cara untuk mencapai ini hanya menggunakan MySQL?
Jawapan:
Ya, adalah mungkin untuk menyertai pada ';' nilai dipisahkan dalam lajur menggunakan MySQL tulen. Di bawah ialah penjelasan terperinci penyelesaian:
Menukar Rentetan Terhad kepada Baris
Kuncinya ialah menukar ';' rentetan terhad kepada satu siri baris. Ini boleh dicapai menggunakan langkah berikut:
- Buat jadual bernama integerseries yang mengandungi nombor dari 1 hingga bilangan maksimum item dalam rentetan yang dipisahkan.
- Gunakan COUNT_IN_SET dan VALUE_IN_SET berfungsi untuk mengira bilangan item dalam rentetan yang dibataskan dan mengekstrak setiap item berdasarkan kedudukannya.
- Sertai jadual sumber_pengguna dengan jadual integerseries menggunakan cantuman silang. Ini akan menjana baris untuk setiap item dalam rentetan yang dibataskan.
Pertanyaan untuk Menormalkan Jadual Sumber_Pengguna
<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>
Menyertai Jadual Ternormal dengan Jadual Sumber
Setelah jadual sumber_pengguna dinormalkan, ia boleh dicantumkan dengan jadual sumber untuk mendapatkan hasil yang diingini.
<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>
Sampel Input dan Output
Jadual sumber_pengguna:
user | resources |
---|---|
user1 | 1;2;4 |
user2 | 2 |
user3 | 3;4 |
Jadual sumber:
id | data |
---|---|
1 | data1 |
2 | data2 |
3 | data3 |
4 | data4 |
5 | data5 |
Jadual_sumber_pengguna biasa:
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 |
Output (Keputusan Menyertai):
user | data |
---|---|
user1 | data1 |
user1 | data2 |
user1 | data4 |
user2 | data2 |
Atas ialah kandungan terperinci Bolehkah saya Menyertai Jadual dalam MySQL Berdasarkan Nilai yang Dipisahkan oleh Titik Bertitik?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Kurangkan penggunaan memori MySQL di Docker

Bagaimana anda mengubah jadual di MySQL menggunakan pernyataan Alter Table?

Cara menyelesaikan masalah MySQL tidak dapat membuka perpustakaan bersama

Apa itu SQLite? Gambaran Keseluruhan Komprehensif

Jalankan MySQL di Linux (dengan/tanpa bekas podman dengan phpmyadmin)

Menjalankan Pelbagai Versi MySQL di MacOS: Panduan Langkah demi Langkah

Bagaimanakah saya menjamin MySQL terhadap kelemahan biasa (suntikan SQL, serangan kekerasan)?

Apakah beberapa alat GUI MySQL yang popular (mis., MySQL Workbench, phpmyadmin)?
