Mysql 选择列值为1而非4的人员

Mysql 选择列值为1而非4的人员,mysql,Mysql,问题是: 列出已在演出id 1(而非4)中购买门票的顾客姓名 相关表格 1性能 SaleId > SaleTime > Total > PerformanceId > PatronId 1 2014-02-12 12:10:11 100.00 1 1 2 2014-02-12 12:10:11 40.00 1 2 3 2014-02-12 12:10:11 30.00 1 3 4 2014-02-12 12:10:11 30.00

问题是:

列出已在演出id 1(而非4)中购买门票的顾客姓名

相关表格 1性能

SaleId > SaleTime > Total > PerformanceId > PatronId
1   2014-02-12 12:10:11 100.00  1   1
2   2014-02-12 12:10:11 40.00   1   2
3   2014-02-12 12:10:11 30.00   1   3
4   2014-02-12 12:10:11 30.00   1   null
5   2014-02-12 12:10:11 100.00  4   1
6   2014-02-12 12:10:11 40.00   4   5
7   2014-02-12 12:10:11 30.00   4   3
8   2014-02-12 12:10:11 30.00   4   null
9   2014-02-12 12:10:11 100.00  7   1
10  2014-02-12 12:10:11 40.00   7   4
11  2014-02-12 12:10:11 30.00   7   3
12  2014-02-12 12:10:11 30.00   7   null
2赞助人

PatronId > lastName > firstName

1   Paul      Smith
2   Linda     Odom
3   Gigi      Koo
4   Kailee    Jefferson
5   Kimberly  Heart
6   boyle     Heart
7   Kimberly  Beetle
8   boyle     Beetle
9   Joe       Junior
10  Jane      Junior
11  Junior    Junior
12  Kar       Kargoolie
我的SQL代码是:

select distinct lastName, firstName
from Patron p, ticketsale t1, ticketsale t2
where p.PatronId = t1.PatronId
and p.PatronId = t2.PatronId
and t1.PerformanceId = 1
and t2.PerformanceId <> 4;
这不起作用,因为它提供了3个名字paul、linda、gigi和我应该只得到linda的查询

使用子查询时,不存在相反的情况:

SELECT
  pt.lastname, pt.firstname
FROM
  patron pt
WHERE
  EXISTS ( 
           SELECT 1 
           FROM performance pf 
           WHERE pt.patronid = pf.patronid AND pf.performanceid = 1 
         )
  AND NOT EXISTS ( 
           SELECT 1 
           FROM performance pf 
           WHERE pt.patronid = pf.patronid AND pf.performanceid = 4 
         )
测试

请参见上的实时示例

我只使用性能表中示例数据中的用户,其他用户不需要证明这一点:

create table patron(patronid int, lastname varchar(50), firstname varchar(50));
insert into patron values 
(1, 'Paul', 'Smith'),
(2, 'Linda', 'Odom'),
(3, 'Gigi', 'Koo'),
(4, 'Kailee', 'Jefferson'),
(5, 'Kimberly', 'Heart');

create table performance(performanceid int, patronid int);
insert into performance values
(1,1),(1,2),(1,3),(1,null),(4,1),(4,5),(4,3),(4,null),(7,1),(7,4),(7,3),(7,null);
我的查询返回:

lastname | firstname
---------+----------
Linda    | Odom

我认为你应该在一张桌子上做一个where条件

 select distinct p.lastName, p.firstName
 from Patron p
 inner join ticketsale as t2 (on p.PatronId = t2.PatronId and t2.PerformanceId = 1)
 where p.PatronId not in  (select distinct t1.PatronId 
 from ticketsale as t1  where t1.PerformanceId <> 4)
给你:

SELECT firstName,
  lastName
FROM patron pat
INNER JOIN performance per1
  ON pat.PatronID = per1.PatronID AND per1.PerformanceID = 1
LEFT OUTER JOIN performance per2
  ON pat.PatronID = per2.PatronID AND per2.PerformanceID = 4
WHERE per2.PerformanceID IS NULL
刚刚在ConsiderMe sqlfiddle上试过。如果要检查(例如)从ID 1而不是从ID 7购票的人,可以将per2.PerformanceID上的条件更改为其他ID,以此类推

如果您想了解发生了什么,请在查询中选择per1.PerformanceID和per2.PerformanceID,然后检查表输出,您将了解:

您可以在不同条件下多次联接同一个表,并避免性能较差的子查询 使用具有同一表的不同别名的where来筛选数据
桌子票在哪里。。。这就是性能吗?这确实会清理代码。谢谢你。然而,这并不能解决我的问题,因为我仍然得到3个名字,而不是1个。但你们有3个performanceID=1的赞助人,所以你们认为你们应该只得到一个名字。。您只有一位观看演出的赞助人4。。。如果您能更好地解释,那么我可以搜索正确的解决方案..我正在搜索购买了performanceID=1但未购买performanceID=4的用户,只有用户ID=2。。也就是说,琳达·奥多姆的用户ID 1和3都在ID 1和4中。用户ID 2仅在ID 1中。答案也是t2。性能ID=4不起作用,因为您的答案没有使用t2错误代码:1064。您的语法有错误:请查看与您的MySQL服务器版本相对应的手册,以了解要使用的正确语法:p.patronId=t1上的left join ticketsale t1。patronId'我尝试了您的语法,但得到了错误代码:“where子句”中的未知列'pf.patronId'。。我不知道如何解决这个问题,但我在global-FROM子句中添加了performance-pf,但它什么也没做。我编辑了我的答案。我有一个打字错误,但除此之外一切都应该是好的。谢谢你重做它,但由于某种原因,错误总是一样的。我不知道为什么您的语句不能在mysql workbench 6.3 CESeems上工作,就像您因为性能表中列的名称而出错一样。它不存在。您确定命名正确吗?也许它是用像“用户ID”这样的背景符号创建的?你是说你在我的sqlfiddle上试过了,对吗P@ConsiderMe哈哈,我应该完全考虑你,哈哈,很抱歉,但你是对的,这是你的小提琴…这就是你回复的时候发生的事情哈哈,那是个玩笑,没必要在帖子里提到我。但是是的;-离开这里!我不知道为什么,但你的给了我一个错误:“on子句”@tcmike-wird中的未知列per1.PatronID。。。它在sqlfiddle上运行良好。。。你有什么版本的mysql?