Maison  >  Article  >  base de données  >  Comment diviser une chaîne en fonction des caractères spécifiés dans Mysql

Comment diviser une chaîne en fonction des caractères spécifiés dans Mysql

WBOY
WBOYavant
2023-06-03 14:00:134524parcourir

Avant-propos

Dans certains scénarios (tels que les utilisateurs téléchargent des fichiers ou des images, etc.), l'approche générale consiste à enregistrer les informations du fichier (nom du fichier, chemin du fichier, taille du fichier, etc.) dans la table des fichiers (user_file), puis Les identifiants de tous les fichiers téléchargés par l'utilisateur sont concaténés avec un caractère spécifié puis stockés dans un champ de la table (utilisateur) (supposé être : file_ids).
Lors de l'affichage des fichiers téléchargés par les utilisateurs, interrogez simplement la table de fichiers directement :

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

Il n'y a aucun problème avec l'instruction sql, et les fichiers peuvent également être interrogés. Cependant, une fois que le fichier téléchargé est supérieur à 1, en utilisant cette instruction sql. pour interroger uniquement Après avoir renvoyé 1 enregistrement, vous pourriez être confus, pourquoi un seul enregistrement est renvoyé ? ? ? ;

Quelqu'un doit avoir fait une telle vérification

-- 先运行下面这个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,',','\',\'') ,'\'') 确实能拼接成上面说的形式,但是结果还是只有一条

La raison est que cette requête ne renvoie qu'un seul champ, donc un seul enregistrement sera renvoyé (même s'il y a plusieurs virgules épissées ensemble, ou épissées manuellement, Mysql ne le considère que être une valeur, en particulier La couche inférieure n'est pas claire...), l'approche correcte est la suivante :

Un : requête en deux fois (ce n'est pas l'objet de cet article, mais elle peut être implémentée)

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');

Deux : Divisez le champ file_ids en plusieurs colonnes, similaire à la conversion ligne-colonne de Mysql

avec La différence entre la conversion de ligne Mysql et la conversion de colonne : vous devez connaître le contenu de la colonne lors de la conversion de lignes en colonnes, mais ce n'est pas le cas nécessaire. Il vous suffit de connaître les caractères d'épissage

-- 下面语句将会把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()里面的话记住只能查询一个字段哦!

L'instruction ci-dessus peut être copiée directement, remplacez simplement les champs a table et a table par les vôtres. Indiquez simplement les champs et. Quant à mysql.help_topic, il est fourni avec Mysql, donc. ne vous inquiétez pas pour ça.

Pièce jointe : Comment MySQL divise-t-il une chaîne par délimiteur

1. Fractionnement de chaîne : SUBSTRING_INDEX (pression artérielle 136/70), par exemple :

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

2. Fonction de remplacement : replace(str, from_str, to_str) . Par exemple :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer