MySQLで指定された文字に従って文字列を分割する方法

WBOY
リリース: 2023-06-03 14:00:13
転載
4540 人が閲覧しました

はじめに

一部のシナリオ (例: ユーザーがファイルや写真をアップロードする場合など) では、一般的なアプローチは、ファイル情報 (ファイル名、ファイル パス、ファイル サイズなど) を次の場所に保存することです。ファイル テーブル (user_file ) を作成し、ユーザーがアップロードしたすべてのファイルの ID を指定された文字で連結し、テーブル (user) のフィールド (file_ids とします) に格納します。
ユーザーがアップロードしたファイルを表示する場合は、ファイル テーブルを直接クエリするだけです:

-- 一般的语句是这样的,假设用户唯一键是id
select * from file where id in(select file_ids from user where id = 1);
ログイン後にコピー

SQL ステートメントに問題はなく、ファイルをクエリすることもできます。ただし、アップロードされたファイルのサイズが大きくなった後は、 1、この SQL ステートメント クエリは 1 つのレコードのみを返します。なぜ 1 つのレコードだけが返されるのか混乱しているかもしれません。 ? ? ;

誰かがそのような検証を行ったに違いありません

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

理由は、このクエリはフィールドを 1 つだけ返すため、レコードは 1 つだけ返されます (複数のカンマが結合されている場合でも、または手動で結合した場合、Mysql はそれを値であるとしか考えず、特定の最下層が明確ではありません...)、正しいアプローチは次のとおりです:

1: 2 回のクエリ (ここでは焦点ではありません)記事を参照してくださいが、実装することは可能です)

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');
ログイン後にコピー

2: Will file_ids フィールドは、Mysql の行から列への変換と同様に、複数の列に分割されます。列変換と MySQL の行から列への変換は、行を列に変換するときに列の内容を知る必要があるということです。これは必要ありません。結合された文字だけを知る必要があります。

-- 下面语句将会把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()里面的话记住只能查询一个字段哦!
ログイン後にコピー

上記のステートメントは直接コピーできます。a table と a table フィールドを独自の式とフィールドに置き換えるだけです。mysql.help_topic については、Mysql に付属しているので、心配する必要はありません。

添付ファイル: mysql はデリミタで文字列をどのように分割しますか

1. 文字列分割: SUBSTRING_INDEX (血圧 136/70 血圧)、例:

SUBSTRING_INDEX(pressure ,&#39;,&#39;,1)     #截取第一个逗号(,)号以前的字符串
SUBSTRING_INDEX(pressure ,&#39;,&#39;,-1)    #截取倒数第一个逗号(,)号以后的字符串
ログイン後にコピー

2 .Replacement関数: replace(str, from_str, to_str)。例:

UPDATE bgs_building_copy1 SET `name`=replace(`name`,&#39;=&#39;,"");    #替换等号为空字符串
ログイン後にコピー

以上がMySQLで指定された文字に従って文字列を分割する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート