私のデータは次のように保存されます
_________________________________
id | category | other data etc
--------------------------------
1 | ["2","3"] |bla bla
--------------------------------
2 | ["254","34"]|bla bla
--------------------------------
3 | ["11","25"] |bla bla
_________________________________
category= 11の行を選択します。どのSQLクエリを使用すればよいですか?
MySQL 5.7を使用していて、category
列が JSON datatype を使用している場合を除いて、これを実際に行うことはできません。そうであれば、 JSON_CONTAINS 関数を使用できます。
SELECT * FROM `yourtable`
WHERE JSON_CONTAINS(category, '"11"')
封じ込めのルールに注意してください:
候補スカラーは、それらが同等であり等しい場合に限り、ターゲットスカラーに含まれます。 2つのスカラー値は、それらが同じJSON_TYPE()タイプであれば比較可能ですが、タイプINTEGERおよびDECIMALの値も互いに比較可能です。
候補配列は、候補のすべての要素がターゲットのいくつかの要素に含まれている場合にのみ、ターゲット配列に含まれます。
候補の非配列は、候補がターゲットのいくつかの要素に含まれている場合にのみ、ターゲット配列に含まれます。
候補オブジェクトは、候補の各キーについてターゲットに同じ名前のキーがあり、候補キーに関連付けられた値がターゲットキーに関連付けられた値に含まれている場合に限り、ターゲットオブジェクトに含まれます。
このデータセットのデータ型に関する問題を確認できます。
CREATE TABLE myjson (
id tinyint unsigned primary key auto_increment,
category JSON
);
mysql> SELECT * FROM myjson;
+----+---------------+
| id | category |
+----+---------------+
| 1 | ["2", "3"] |
| 2 | ["254", "34"] |
| 3 | ["11", "25"] |
| 4 | [2, 11] |
+----+---------------+
4 rows in set (0.00 sec)
mysql> SELECT * FROM `myjson` WHERE JSON_CONTAINS(category, "11");
+----+----------+
| id | category |
+----+----------+
| 4 | [2, 11] |
+----+----------+
1 row in set (0.00 sec)
mysql> SELECT * FROM `myjson` WHERE JSON_CONTAINS(category, '"11"');
+----+--------------+
| id | category |
+----+--------------+
| 3 | ["11", "25"] |
+----+--------------+
1 row in set (0.00 sec)