记录不在中的组联系人行

41ik7eoe  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(249)

我的案子看起来很简单,但我在胡闹。。
我有4个表:user、macros、categories,还有一个将用户与类别关联起来的表。一个宏有许多类别。
我需要的是一个基于宏的查询,获取用户和用户不在其中的类别。
示例:我有一个名为veicles的宏,它的类别有car、truck和motorcycle。用户josé 在category car上,用户julio在category car and truck上,因此我的查询应该返回:

José | TRUCK,Motorcycle
Julio | Motorcycle

表格:prd\U用户

id   |  name  | Email
 ---------------------------
 1    |  José  | jose@email.com
 2    |  Júlio | julio@email.com  
 3    |  André | andre@email.com

cat\U宏

macro_id |  macro_name  
 -----------------------
 1        |  Veicules  |

类别

category_id |  category_name | macro_id  
 ---------------------------------------
 1           |  Cars          |  1
 2           |  Trucks        |  1
 3           |  Motorcycles   |  1

兔子猫

id |  category_id | tasker_user_id  
 ---------------------------------------
 1  |  1           |  1
 2  |  1           |  2
 3  |  2           |  2

我只是在获取用户已经存在的类别时遇到了麻烦。。

SELECT prd_users.id, prd_users.name, 
  prd_users.email,cat_macros.macro_name as macro, 
  GROUP_CONCAT(cat_categories.category_name SEPARATOR ', ') as in_categories 
  FROM prd_users 
  INNER JOIN prd_tr_rabbit_catg ON prd_tr_rabbit_catg.tasker_user_id = prd_users.id
  INNER JOIN cat_categories ON cat_categories.category_id = prd_tr_rabbit_catg.category_id
  INNER JOIN cat_macros ON cat_macros.macro_id = cat_categories.macro_id
  WHERE cat_macros.macro_id = '45'
  GROUP BY prd_users.id;
yuvru6vn

yuvru6vn1#

为了解决这个问题,有必要为给定的宏类别创建一个包含所有类别的所有用户的列表。这可以通过 CROSS JOIN :

SELECT * 
FROM prd_users u
CROSS JOIN (SELECT m.macro_id, m.macro_name, c.category_name, c.category_id
            FROM cat_macros m
            JOIN cat_categories c ON c.macro_id = m.macro_id) c

这样就可以 LEFT JOIN 他被送到了医院 prd_tr_rabbit_catg 表中没有匹配项的行 prd_tr_rabbit_catg 表中,我们可以找到没有给定类别条目的用户:

SELECT c.macro_name, u.id AS user_id, u.name, u.Email, GROUP_CONCAT(c.category_name) AS missing_cats
FROM prd_users u
CROSS JOIN (SELECT m.macro_id, m.macro_name, c.category_name, c.category_id
            FROM cat_macros m
            JOIN cat_categories c ON c.macro_id = m.macro_id) c
LEFT JOIN prd_tr_rabbit_catg x ON x.tasker_user_id = u.id AND x.category_id = c.category_id
WHERE x.id IS NULL
  AND c.macro_id = 1
GROUP BY c.macro_name, u.id

对于您的示例数据,这将提供:

macro_name  user_id     name    Email               missing_cats
Veicules    1           José    jose@email.com      Motorcycles,Trucks
Veicules    2           Júlio   julio@email.com     Motorcycles
Veicules    3           André   andre@email.com     Cars,Motorcycles,Trucks

更新
要排除没有任何类别的用户,请添加 HAVING 条款:

HAVING COUNT(*) < (SELECT COUNT(*) FROM cat_categories WHERE macro_id = 1)

sqlfiddle演示

相关问题