Sử Dụng JSON_CONTAINS Trong MySQL

2019/01/11 4,311 Views PHP Laravel

Bạn có bao giờ Query điều kiện trong một bảng có cột lưu ở dạng JSON chưa? Điều đầu tiên rất nhiều dev sẻ sử dụng LIKE để giải quyết việc này, nhưng đây là một sai làm vì kết quả query sẻ không đúng tuyệt đối khi bạn rơi vào trường hợp dư liệu bạn đang có là [1, 22] mà bạn dùng LIKE '%2%'.

VD dữ liệu db tôi đang có là post và cột category_id là lưu trữ id của danh mục bài viết và được lưu nhiều theo cấu trúc [1,22,...].

Đây là Query MySQL của tôi: SELECT * FROM sh_posts WHERE category_id LIKE '%2%';

Kết quả cho thấy truy vấn như vậy là sai vì tôi đang muốn tìm bài việt có danh mục id là 2, mà kết quả lại lấy bài việt có danh mục id 1 và 22. Ở đây tôi chỉ ví dụ để các bạn hình dung được function mà tôi sẻ giới thiệu ở dưới đây nó thú vị và hay chừng nào nhé.

Sử dụng JSON_CONTAINS Trong MySQL.

JSON_CONTAINS là một function mới của MySQL 5.7 trở lên để giải quyết vấn đề trên một cách triệt để.

Tôi sẻ thư áp dụng tìm bài viết có danh mục id là 2 xem sao. Nếu không có kết quả nào thì chính xác vì trong dữ liệu không có bài việt là có danh mục id là 2.

Kết quả sau khi tôi run SQL thì không có kết quả nào, suy ra chính xác.

Tiếp tục tôi tìm bài viết có danh mục id là 22 xem sao. Nếu ra 1 kết quả là đúng.

Kết quả đúng như tôi suy nghỉ, JSON_CONTAINS đã giúp tôi giải truy vấn một cột có kiểu dữ liệu lưu trữ là JSON một cách chính xác tuyệt đôi. Và dưới đây là những ví dụ khác mà JSON_CONTAINS hỗ trợ.

Ví dụ nếu trả về số record tìm thấy trong table nhé. Ở đây 1 là có 1 record được tìm thấy.


VD 01:
SET @doc1 = '{"a": 1, "b": 2, "c": {"d": 3}}';
SET @doc2 = '{"c": {"d": 3}}';
SELECT JSON_CONTAINS(@doc1, @doc2) AS Result;
--------------------------------
Kết quả sẻ là : 1


VD 02:
SET @doc1 = '{"a": 1, "b": 2, "c": {"d": 3}}';
SET @doc2 = '"c": {"d": 3}';
SELECT JSON_CONTAINS(@doc1, @doc2) AS Result;
--------------------------------
Kết quả sẻ là : 1


VD 03:
SET @doc1 = '{"a": 1, "b": 2, "c": {"d": 3}}';
SET @doc2 = '1';
SELECT JSON_CONTAINS(@doc1, @doc2, '$.a') AS Result;
--------------------------------
Kết quả sẻ là : 1


VD 04:
SET @doc1 = '{"a": 1, "b": 2, "c": {"d": 3}}';
SET @doc2 = '3';
SELECT JSON_CONTAINS(@doc1, @doc2, '$.c.d') AS Result;
--------------------------------
Kết quả sẻ là : 1

Sử dụng JSON_CONTAINS trong Laravel.

Code Eloquent: Post::whereJsonContains('category_id', 2)->get();

Nếu bạn nào có cách hay hơn thì cứ chia sẻ bên dưới nhé, mình luôn sẳn sàng học những điều hay...