mysql使用中间表从一个表中选择所有行,即使在另一个表中没有匹配的行
我无法从表中选择所有行并用0填充不匹配的行 Table "modul" ---------------------------------------------------------- | id | menu_name | modul_name | all_access | ---------------------------------------------------------- 1 books book 0 2 cds cd 0 3 tapes tape 0 如果我运行用户名vedran查询,我希望得到如下输出 ------------------------------------------------------------------ | id | menu_name | modul_name | all_access | active | ------------------------------------------------------------------ 1 books book 0 1 2 cds cd 0 1 3 tapes tape 0 0 所以用户vedran的id为1,id为1的用户有活动模块1和2,但我也希望得到第三个模块,但设置为0 模型如下所示: 我尝试使用此查询: SELECT M.*, ZM.active FROM modul M JOIN user_modul UM ON (M.id = UM.modul_id) JOIN user U ON (UM.user_id = U.id) WHERE U.id = 1 ORDER BY M.id ASCmysql使用中间表从一个表中选择所有行,即使在另一个表中没有匹配的行,mysql,join,Mysql,Join,我无法从表中选择所有行并用0填充不匹配的行 Table "modul" ---------------------------------------------------------- | id | menu_name | modul_name | all_access | ---------------------------------------------------------- 1 books book
但这只返回两行,而不是modul表中的所有行。也许您可以使用UNION而不是IN这样做:
SELECT modul.id AS id, modul.menu_name AS menu_name, modul.modul_name AS modul_name, modul.all_access AS all_access, "1" AS active
FROM modul
LEFT JOIN user_modul
ON user_modul.modul_id = modul.id
LEFT JOIN user
ON user.id = user_modul.user_id
WHERE user.username = "vedran"
UNION
SELECT id, menu_name, modul_name, all_access, "0" AS active
FROM modul
WHERE id NOT IN
SELECT modul.id
FROM modul
LEFT JOIN user_modul
ON user_modul.modul_id = modul.id
LEFT JOIN user
ON user.id = user_modul.user_id
WHERE user.username = "vedran"
基本上,我要做的是,获取用户可以访问的所有模块,并在active列中添加值1,然后,我将用户无法访问的所有模块添加到此表中,值为0
也许这段代码包含一些错误,因为我没有尝试过,我没有数据库来测试它,但我想你已经知道了
我希望我在你的项目中帮助了你
编辑:也许可以使用临时表来避免重复查询
在1上编辑1个交叉连接经典解决方案而不使用技巧
如果需要modul表中的所有行,我的建议是将该表放在第一位,然后对其余表使用left join:
SELECT M.*, COALESCE(UM.active, 0)
FROM modul M LEFT JOIN
user_modul UM
ON M.id = UM.modul_id LEFT JOIN
user U
ON UM.user_id = U.id AND U.id = 1
ORDER BY M.id ASC
将WHERE逻辑移到ON子句是很重要的
我不建议在同一个查询中混合使用左连接和右连接。关于哪个表保留了所有行,它变得很混乱。在所需的输出中如何计算active?您能提供更多的信息吗?您是如何尝试检索数据的?您使用的是SQL吗?如果是的话,它是什么?活动的来自用户模块表。如果用户模块表中没有该用户的模块id,则活动应为0。我将对我的问题稍加修改,以澄清问题。简短、简单,并且完全符合我的需要。请你再花一分钟写几个关于COALESCE和on 1的单词好吗。我将谷歌它一点,以了解它更多。谢谢大家!@Vedran COALESCE just函数返回第一个非空值。所以这只是当um.active为NULL,然后为0时的简短形式。在1上只是一个技巧,你可以做交叉连接,但我更喜欢在1上左连接不知道为什么,只是我的习惯:-
SELECT modul.id AS id, modul.menu_name AS menu_name, modul.modul_name AS modul_name, modul.all_access AS all_access, "1" AS active
FROM modul
LEFT JOIN user_modul
ON user_modul.modul_id = modul.id
LEFT JOIN user
ON user.id = user_modul.user_id
WHERE user.username = "vedran"
UNION
SELECT id, menu_name, modul_name, all_access, "0" AS active
FROM modul
WHERE id NOT IN
SELECT modul.id
FROM modul
LEFT JOIN user_modul
ON user_modul.modul_id = modul.id
LEFT JOIN user
ON user.id = user_modul.user_id
WHERE user.username = "vedran"
SELECT
m.* , COALESCE(um.active,0)
FROM user u
RIGHT JOIN modul m
ON 1
LEFT JOIN user_modul um
ON um.modul_id = m.id AND um.user_id=u.id
WHERE u.username='vedran'
SELECT
m.* , COALESCE(um.active,0)
FROM user u
CROSS JOIN modul m
LEFT JOIN user_modul um
ON um.modul_id = m.id AND um.user_id=u.id
WHERE u.username='vedran';
SELECT M.*, COALESCE(UM.active, 0)
FROM modul M LEFT JOIN
user_modul UM
ON M.id = UM.modul_id LEFT JOIN
user U
ON UM.user_id = U.id AND U.id = 1
ORDER BY M.id ASC