如何从MySQL表中获得与其他两个表不匹配的结果

时间:2014-07-01 22:51:28

标签: mysql sql

一直试图弄清楚这一个并且挣扎。这个问题与MySQL数据库有关。

我需要SELECT一个表中不会出现在另外两个表中的所有记录。

例如,请使用以下表格:

表1

| email     |  module | name    |
| a@ba.com  |  401    | Chris   |
| a@ba.com  |  402    | Chris   |
| a@ba.com  |  403    | Chris   |
| a@ba.com  |  404    | Chris   |
| a@ba.com  |  405    | Chris   |
| z@xy.com  |  401    | Anna    |
| z@xy.com  |  402    | Anna    |
| z@xy.com  |  403    | Anna    |
| z@xy.com  |  404    | Anna    |
| z@xy.com  |  405    | Anna    |

表2

| email     | module | requested |
| a@ba.com  | 402    | Yes       |
| a@ba.com  | 403    | No        |
| z@xy.com  | 403    | Yes       |

表3

| email     | module    | received |
| a@ba.com  | 405       | Yes      |
| z@xy.com  | 401       | No       |
| z@xy.com  | 404       | No       |

我需要能够搜索这三个表来查找电子邮件地址匹配的记录。然后我想要从table1中选择模块对该表唯一的所有行,即它不会出现在其他两个表中。例如,对于名为 Chris 的用户,我希望查询返回以下结果,因为两个模块( 401 404 )可以没有出现在其他两个表中:

| email     | module  | name   |
| a@ba.com  | 401     | Chris  |
| a@ba.com  | 404     | Chris  |

我尝试过使用不同类型的JOIN短语,并且在晚上的大部分时间里都试图找到答案,但无济于事。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:2)

LEFT JOIN应该会让你在MySQL中表现出色:

SELECT t1.email
     , t1.module
     , t1.name
FROM table1 t1 LEFT JOIN table2 t2 ON t1.email = t2.email 
                                  AND t1.module = t2.module
               LEFT JOIN table3 t3 ON t1.email = t3.email
                                  AND t1.module = t3.module
WHERE t2.email IS NULL 
  AND t3.email IS NULL

答案 1 :(得分:0)

我认为你需要

WHERE NOT EXISTS() 

子句。这是EXISTS()子句的变体。

答案 2 :(得分:0)

SELECT x.* 
  FROM table1 x
  LEFT 
  JOIN
     ( SELECT * FROM table2
       UNION
       SELECT * FROM table3
     ) y
    ON y.email = x.email 
   AND y.module = x.module
 WHERE y.module IS NULL;