MySQL联接查询与JSON字段类型

时间:2019-03-20 10:30:57

标签: mysql sql

我有三个桌子。在类别中,我有18条记录,在区域中,我有8条记录。

在client_profiles表中,区域字段可能看起来像[1]或[2]或[1,3]等

类别将类似于[1]或[2]或[1,3]等

client_profile必须至少具有一个区域和至少一个类别。

例如,我有100个client_profiles。每个人都属于一个区域,每个人至少具有一个类别。

让我说我在做Area = 1,我正在寻找所有类别(无论如何)以及每个类别中有多少client_profiles。

我如何实现他的目标:

results example

下面的表格示例。

CREATE TABLE categories (
id INT AUTO_INCREMENT PRIMARY KEY,
category_description VARCHAR(255) NOT NULL UNIQUE,
isActive boolean NOT NULL DEFAULT true
);

CREATE TABLE areas (
id INT AUTO_INCREMENT PRIMARY KEY,
area_description VARCHAR(255) NOT NULL UNIQUE,
isActive boolean NOT NULL DEFAULT true
);

CREATE TABLE client_profiles (
id INT AUTO_INCREMENT PRIMARY KEY,
businessName VARCHAR(60) NOT NULL UNIQUE,
first_name VARCHAR(60) NOT NULL,
last_name VARCHAR(60) NOT NULL,
mob_no VARCHAR(13) NOT NULL,
email VARCHAR(30) NOT NULL,
areas JSON NOT NULL,
catarea JSON NOT NULL,
);

select id, areas 
from client_profiles
where JSON_CONTAINS(areas, '1',"$");

INSERT INTO categories (category_description, isActive) values 
('Accomodation', true),
('Automative', true),
('Adult', true),
('Arts & Crafts', true),
('Events', true),
('Financial', true),
('Garden', true),
('House & Home', true),
('IT & Technology', true),
('Kids', true),
('Legal', true),
('Medical', true),
('Pets', true),
('Pregnancy(Babies)', true),
('Property', true),
('Travel & Tourism', true),
('Transport', true),
('Wellness & Beauty', true);

1 个答案:

答案 0 :(得分:0)

我想你想要这样的东西...

SELECT
  c.id,
  COUNT(p.id)
FROM
  categories        c
LEFT JOIN
  client_profiles   p
    ON  JSON_CONTAINS(p.areas,      '1',                    '$')
    AND JSON_CONTAINS(p.categories, CAST(c.id AS CHAR(32)), '$')
GROUP BY
  c.id