连接多个表以在MySQL中获取NOT EQUAL值

时间:2017-07-12 19:52:25

标签: mysql sql

我已经尝试了3天来解决这个问题 - 现在我需要你们: - )

我需要加入3个表:

table data        table user           table collection
data_id | colors  user_id | user_name  collection_id | user_id | data_id
----------------  -------------------  ---------------------------------
   1    | blue       1    | Brian            1       |    1    |    1
   2    | red        2    | Jason            2       |    2    |    3
   3    | green      3    | Marie            3       |    1    |    3
   4    | yellow                             4       |    3    |    2

输出是用户特定的。这意味着布莱恩不想看到蓝色和绿色,杰森不想看到绿色和玛丽不想看到红色。 这应该给出以下输出:

for Brian           for Jason             for Marie
id | colors         id | colors           id | colors
-----------         -----------           -----------
2  | red            1  | blue             1  | blue
4  | yellow         2  | red              3  | green
                    4  | yellow           4  | yellow

这是我最好的尝试(现在)如何解决这个问题:

SELECT 
    *
FROM
    data d
        INNER JOIN
    user u ON u.user_id = d.user_id
        LEFT JOIN
    collection c ON c.data_id = d.data_id
WHERE
    c.user_id <> '1' OR c.collection_id IS NULL

结果是Brian的选择将被整理出来 - 这很好!但是因为杰森不想看到绿色,所以它仍然被布莱恩选中。 很混乱!

我希望我能写得或多或少可以理解=)

非常感谢所有帮助和提示!

欢呼声

编辑:此解决方案已延长并缩短了此解决方案:replace the id with the username from an other table in a CROSS JOIN in MySQL

2 个答案:

答案 0 :(得分:3)

可以使用交叉联接而不是table_collection

select user.id, user.name, data.data_id, data.data
from user 
cross join data
where (  user.user_id, data.data_id) not in ( 
   select user_id, data_id 
   from table_collection
)  

答案 1 :(得分:2)

我不确定我是否理解你想要的东西,但你可以试试这个:

SELECT *
FROM data d
INNER JOIN user u ON 1=1
WHERE (u.id, d.id) NOT IN (SELECT user_id, data_id FROM collection)