【问题标题】:Joining multiple tables to get NOT EQUAL values in MySQL连接多个表以在 MySQL 中获取 NOT EQUAL 值
【发布时间】:2017-07-12 19:52:24
【问题描述】:

我已经尝试了 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 的选择将得到整理 - 这很好!但是因为 Jason 也不想看到绿色,所以仍然选择了 Brian。 相当混乱!

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

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

干杯

编辑:此解决方案已扩展并通过此解决方案变得更短:replace the id with the username from an other table in a CROSS JOIN in MySQL

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    可能是使用交叉连接而不是在 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
    )  
    

    【讨论】:

    • 就是这样!我只在 where 子句 AND a.id = 1 之后添加,它工作得很好。非常感谢:-))
    • @scaisEdge:别名太可怕了。他们甚至使这个简单的查询有点难以阅读。
    • @ThorstenKettner 。正确(在这种情况下,表名很短).. 答案已更新,避免使用别名
    • 你们是对的。我编辑了别名以便(希望)更好地阅读。
    • 在数据表中有一个名为“ addedby”的额外列,它继承了用户表的user_id。是从 html 表单中将此条目添加到数据库中的名称。是否可以扩展您的脚本以显示谁添加了此条目?
    【解决方案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)
    

    【讨论】:

    • @fhossfel:INNER JOIN user u ON 1=1?这是一个交叉连接,所以你不应该让它看起来像一个内部连接,而是写CROSS JOIN user
    • 呃,对了,你是菲利克斯吗?
    • 是的,它是 :-) 我不确定 MySQL 是否支持 CROSS JOIN 语法。 on 1=1 对我来说似乎总是更便携。
    • @fhossfel:嗯,是的,MySQL 有时很特别(例如,您可以编写 INNER JOIN 并省略 ON 子句)。但它支持CROSS JOIN。到目前为止,我所知道的唯一支持 INNER JOIN 但不支持 CROSS JOIN 的 DBMS 是 MS Access - 但是,那是 MS Access ;-) 很高兴看到我们有同样的爱好,顺便说一句:-)
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2014-04-23
    • 2018-08-31
    • 1970-01-01
    • 2015-01-14
    相关资源
    最近更新 更多