我的案子看起来很简单,但我在胡闹。。
我有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;
1条答案
按热度按时间yuvru6vn1#
为了解决这个问题,有必要为给定的宏类别创建一个包含所有类别的所有用户的列表。这可以通过
CROSS JOIN
:这样就可以
LEFT JOIN
他被送到了医院prd_tr_rabbit_catg
表中没有匹配项的行prd_tr_rabbit_catg
表中,我们可以找到没有给定类别条目的用户:对于您的示例数据,这将提供:
更新
要排除没有任何类别的用户,请添加
HAVING
条款:sqlfiddle演示