MySql显示的值不在第二个表中

时间:2013-11-30 10:48:57

标签: mysql join intersection

我正在尝试为已预订一个活动的人提供其他活动的门票。我有两个表,如

---Concerts----------------
|  ConcertID  | Concert   |
---------------------------
|   101       | Mozart    |
|   102       | Beethoven |
|   103       | Chopin    |
---------------------------

---Tickets--------------------------------------------
| TicketNum |  Name      |  email       | ConcertID  | 
------------------------------------------------------
| 5001      | Amy Jones  | aaa@aaa.com  |  101       |
| 5002      | Amy Jones  | aaa@aaa.com  |  102       |
| 5003      | John Doe   | bbb@bbb.com  |  102       |
| 5004      | Adam Smith | ccc@ccc.com  |  101       |
| 5005      | Jerry Coe  | ddd@ddd.com  |  102       |
------------------------------------------------------

我正在尝试构建一个像

这样的语句
SELECT Tickets.email, Concerts.ConcertID, Concerts.Concert FROM Tickets, Concerts 
WHERE (Show Concerts Not Booked)
AND Concerts.ConcertID = Tickets.ConcertID 
AND email = "bbb.com"  

这个节目然后返回两场音乐会,约翰·多伊没有被预订,即101莫扎特和102肖邦。

我正在努力的

我可以构建一个查询来显示他预订的音乐会的交集,但我无法显示他没有预订的音乐会。

感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

Select c.ConcertID, C.Concert
From Concerts c
Left join Tickets t On t.ConcertID = c.ConcertID
Where t.ConcertID is null and t.Name = 'John Doe'

会这样做。

没有别名可能会让事情变得更清晰

Select Concerts.ConcertID, Concerts.Concert
From Concerts
Left join Tickets On Tickets.ConcertID = Concerts.ConcertID
Where Tickets.ConcertID is null and Tickets.Name = 'John Doe'

想一想,如果你想要一份所有音乐会的名单以及John是否买了票 你会做的

Select *
From Concerts
Left join Tickets On Tickets.ConcertID = Concerts.ConcertID
Where Tickets.Name = 'John Doe'

并获取

101 Mozart    NULL  NULL    NULL        NULL 
102 Beethoven 5003 John Doe bbb@bbb.com 102
103 Chopin    NULL NULL     NULL        NULL

所以where语句中的额外条件会过滤掉没有票证的行。

那是令人恼火的,在玩@JungSu Heo的sql小提琴后,我觉得这很有效

Select *
From Concerts c
Left join Tickets t On t.ConcertID = c.ConcertID and t.Name = 'John Doe'
Where t.ConcertID is null

经过一番思考后才有意义,因为John Doe在where子句中被删除了。在join子句中执行,然后John Doe仅用于约束外连接。

谢谢你学到的东西,虽然我通常不会看到这样的东西,因为我有一个名字/预订者类型表。

答案 1 :(得分:1)

我无法理解为什么Tony的查询不起作用。你能试试吗?

SELECT c.ConcertID, c.Concert
FROM Concerts c
WHERE c.ConcertID NOT IN 
(
    SELECT ConcertID
    FROM Tickets
    WHERE Name = 'John Doe'
)

如果您在http://www.sqlfiddle.com/发布数据,我们将非常感谢您。容易测试。