TBL频繁模式-饮酒者VARCHAR(50)PK,bar VARCHAR(50)PK
John或Rebecca经常光顾的酒吧,但两者都不是
我的查询是:
(((从酒徒='john'的常去酒吧选择)(从酒徒='Rebecca'的常去酒吧选择)
减
(从频率f1中选择f1.bar,频率f2,其中f1.bar = f2.bar和f1.drinker ='john'和f2.drinker ='rebecca')
但是减号一直给我一个语法错误,说“减号在期望eof的这个位置无效;”但我不知道如何解决它。我加了;不同的地方,看看是否可行,但我没有得到答案。我知道我所有的子查询都返回正确的值,我只需要让减号运算符起作用即可。
谢谢:)
答案 0 :(得分:0)
不幸的是,MySQL不支持MINUS运算符。但是,您可以使用MySQL连接对其进行仿真。该策略是将所有行都保留为LEFT JOIN并保留第二行为NULL的行,因为这意味着不进行运算(MINUS)。
在您的示例中:
SELECT table1.bar
FROM ((select bar from frequents where drinker='john') UNION (select bar from frequents where drinker='Rebecca')) table1
LEFT JOIN (select f1.bar from frequents f1, frequents f2 where f1.bar=f2.bar and f1.drinker='john' and f2.drinker='rebecca') table2 ON (table1.bar = table2.bar)
WHERE table2.bar IS NULL;
我希望这会有所帮助。
答案 1 :(得分:0)
尽管您的一张酒水和吧台表还可以,但是您可能希望在事态发展之前研究规范化的数据...拥有一个包含所有吧台的主表,一个所有人的另一个表以及一个只保存着吧台的主表每个酒吧和参加者的ID。
话虽如此,我将对每个名称写一个查询到相关表的查询,但仅在两个都不为空的情况下进行。
select
AllBars.Bar
from
( select distinct bar
from frequents ) AllBars
LEFT JOIN ( select distinct bar
from frequents
where drinker = 'john' ) JohnsBars
on AllBars.bar = JohnsBars.bar
LEFT JOIN ( select distinct bar
from frequents
where drinker = 'Rebecca' ) RebeccasBars
on AllBars.bar = RebeccasBars.bar
where
( JohnsBars.bar IS NOT NULL
OR RebeccasBars.bar IS NOT NULL )
AND NOT ( JohnsBars.bar = RebeccasBars.Bar )
因此,OR的第一部分必须确保其中至少有一个进入标准。 AND部分可确保他们不会一起进入SAME栏。