Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql使用中间表从一个表中选择所有行,即使在另一个表中没有匹配的行_Mysql_Join - Fatal编程技术网

mysql使用中间表从一个表中选择所有行,即使在另一个表中没有匹配的行

mysql使用中间表从一个表中选择所有行,即使在另一个表中没有匹配的行,mysql,join,Mysql,Join,我无法从表中选择所有行并用0填充不匹配的行 Table "modul" ---------------------------------------------------------- | id | menu_name | modul_name | all_access | ---------------------------------------------------------- 1 books book

我无法从表中选择所有行并用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 ASC
但这只返回两行,而不是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