質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

解決済

1回答

1278閲覧

MariaDBでIN句にJSONデータを利用したい

退会済みユーザー

退会済みユーザー

総合スコア0

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

1クリップ

投稿2019/05/31 18:55

編集2019/05/31 19:14

テーブル定義

sql

1CREATE TABLE IF NOT EXISTS `items` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL, 4 PRIMARY KEY (`id`) 5) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; 6 7INSERT INTO `items` (`id`, `name`) VALUES 8 (1, 'item001'), 9 (2, 'item002'); 10 11CREATE TABLE IF NOT EXISTS `weapons` ( 12 `id` int(11) NOT NULL AUTO_INCREMENT, 13 `item` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL, 14 PRIMARY KEY (`id`) 15) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 16 17INSERT INTO `weapons` (`id`, `item`) VALUES 18 (1, '{"item_ids":[1,2]}');

やりたい事

以下のSQLと同じ意味の事をJSONデータを利用して行いたいです。
求めている結果もこのSQLの実行結果と同じです。

select * from items i where i.id in (1,2);

実行結果

聞きたい事

以下のSQLを実行すると結果が0件になります。

sql

1select * from items i where i.id in ( 2 select JSON_EXTRACT(item, '$.item_ids') from weapons w where w.id=1 3);

おそらく、IN句にJSONの文字列データが渡されている為0件になっています。

weaponsテーブルのitemカラムのデータが複数行データとして取得できていればIN句で利用できると思いましたがやり方が分かりませんでした。

どのようなSQLを書けばよいでしょうか。

環境

10.2.12-MariaDB

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/31 20:58

>select JSON_EXTRACT(item, '$.item_ids') from weapons w where w.id=1 上記だけの実行結果はどうなっていますか?
退会済みユーザー

退会済みユーザー

2019/06/01 03:12

文字列で"[1,2]"が得られました。 つまりselect * from items i where i.id in ("[1,2]")というSQLになっている為、期待する結果が得られていないと思います。
guest

回答1

0

ベストアンサー

SQL

1where i.id in ( 2 select JSON_EXTRACT(item, '$.item_ids') from weapons w where w.id=1 3)

これだと、i.id in ("[1,2]")のような抽出になっていますので意図する所では無いですね。

MySQL8.0だと**JSON_TABLE()**が使用できますが、MariaDBには該当するものがないので、in記述を使用するなら、自前で用意するしかありません。

existsなら相関副問合せで同様の結果が得られると思います。

SQL

1select * from items i where exists( 2 select 1 from weapons 3 where id=1 and JSON_CONTAINS(item, concat('[', i.id, ']'), '$.item_ids') 4)

投稿2019/06/01 01:21

編集2019/06/01 13:35
sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/06/01 03:33 編集

ご回答有り難うございます。 しかし、ご回答頂いたSQLを実行しても期待する結果が得られませんでした。 おそらく、JSON_EXTRACT(item, '$.item_ids[*]')=i.idこの部分がうまく比較出来ていないと思いました。 自分なりにFIEND_IN_SETを利用して書き直したのですがこちらも期待する結果が得られませんでした。 select * from items i where exists( select 1 from weapons w where w.id=1 and FIND_IN_SET(i.id, REPLACE(REPLACE(JSON_EXTRACT(w.item, '$.item_ids'),'[' , ''), ']', '')) )
sazi

2019/06/01 13:35 編集

JSON_CONTAINS使ってみるのはどうでしょう。 JSON_CONTAINS(item, concat('[', i.id, ']'), '$.item_ids')
退会済みユーザー

退会済みユーザー

2019/06/01 06:59

ありがとうございます。 以下のSQLで期待する結果が得られました。 select * from items i where exists( select 1 from weapons w where id = 1 and JSON_CONTAINS(w.item, concat('[', i.id, ']'), '$.item_ids') )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問