Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk memisahkan rentetan mengikut aksara yang ditentukan dalam Mysql

Bagaimana untuk memisahkan rentetan mengikut aksara yang ditentukan dalam Mysql

WBOY
WBOYke hadapan
2023-06-03 14:00:134531semak imbas

Kata Pengantar

Dalam senario tertentu (seperti pengguna memuat naik fail atau gambar, dsb.), pendekatan umum adalah untuk menyimpan maklumat fail (nama fail, laluan fail, saiz fail, dll.) ke fail table (user_file ), dan kemudian gabungkan ID semua fail yang dimuat naik oleh pengguna dengan aksara yang ditentukan dan simpannya dalam medan dalam jadual (pengguna) (diandaikan sebagai: file_ids).
Apabila memaparkan fail yang dimuat naik oleh pengguna, hanya tanya jadual fail secara langsung:

-- 一般的语句是这样的,假设用户唯一键是id
select * from file where id in(select file_ids from user where id = 1);

Tiada masalah dengan pernyataan SQL, dan fail juga boleh ditanya, bagaimanapun, selepas fail yang dimuat naik lebih besar daripada 1, gunakan Pertanyaan pernyataan SQL ini hanya mengembalikan satu rekod Anda mungkin keliru, mengapa hanya satu rekod yang dikembalikan? ? ? ;

Seseorang mesti telah melakukan pengesahan sedemikian

-- 先运行下面这个sql,正确返回1,2,3 假设上传的文件id是1,2,3;
select file_ids from user where id = 1
-- 然后返回的文件id写死在sql语句中,运行成功返回3条记录
select file_ids from user where id in ('1' , '2' , '3');
-- 最后再整体试了下,结果返回一条......
select * from file where id in(select file_ids from user where id = 1)

-- 然后可能会想到:我把in里面的拼接成'1','2','3',这样总可以了吧?
select * from file where id in (select concat('\'', replace(file_ids,',','\',\'') ,'\'') from user where id = 1);
-- concat('\'', replace(file_ids,',','\',\'') ,'\'') 确实能拼接成上面说的形式,但是结果还是只有一条

Kerana pertanyaan ini hanya mengembalikan satu medan, jadi hanya satu rekod akan dikembalikan (walaupun terdapat berbilang koma yang disambungkan bersama, atau secara manual disambungkan, Mysql hanya menganggapnya sebagai nilai, dan lapisan bawah khusus tidak jelas...), pendekatan yang betul adalah seperti berikut:

Satu: Pertanyaan dalam dua kali (bukan fokus artikel ini, tetapi ia boleh dilaksanakan)

select file_ids from user where id = 1

select file_ids from user where id in ('1' , '2' , '3');
或者
select file_ids from user where find_in_set(id , '1,2,3');

Dua: Medan file_id dibahagikan kepada berbilang lajur, serupa dengan baris ke lajur Mysql

Perbezaan antara baris ke lajur dan baris ke lajur Mysql: baris kepada penukaran lajur memerlukan mengetahui kandungan lajur, tetapi ini tidak perlu diketahui Anda hanya perlu mengetahui aksara bersambung

-- 下面语句将会把1,2,3,4一个字段转换成四行,依次是1,2,3,4
SELECT
	a.id,
	a.file_ids,
	substring_index(
		substring_index(
			a.file_ids,
			',',
			b.help_topic_id + 1
		),
		',' ,- 1
	) file_id
FROM
	user a
JOIN mysql.help_topic b ON b.help_topic_id < (
	length(a.file_ids) - length(REPLACE(a.file_ids, &#39;,&#39;, &#39;&#39;)) + 1
)
where id = 1
;
-- 然后将上面语句写在in()里面就行了,写在in()里面的话记住只能查询一个字段哦!

Pernyataan di atas boleh disalin terus dan medan jadual dengan ungkapan dan medan anda sendiri Bagi mysql.help_topic, ia disertakan dengan Mysql, jadi jangan risau.

Lampiran: Cara membelah rentetan mengikut pembatas dalam MySQL

1 Pemisahan rentetan: SUBSTRING_INDEX (tekanan 136/70 tekanan darah), contohnya:

SUBSTRING_INDEX(pressure ,&#39;,&#39;,1)     #截取第一个逗号(,)号以前的字符串
SUBSTRING_INDEX(pressure ,&#39;,&#39;,-1)    #截取倒数第一个逗号(,)号以后的字符串

2 . Fungsi penggantian: ganti(str, from_str, to_str). Contohnya:

UPDATE bgs_building_copy1 SET `name`=replace(`name`,&#39;=&#39;,"");    #替换等号为空字符串

Atas ialah kandungan terperinci Bagaimana untuk memisahkan rentetan mengikut aksara yang ditentukan dalam Mysql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam