Mysql 选择列值为1而非4的人员
问题是: 列出已在演出id 1(而非4)中购买门票的顾客姓名 相关表格 1性能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
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?