MySQL联合减号语法

时间:2018-09-16 21:27:02

标签: mysql syntax-error

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的这个位置无效;”但我不知道如何解决它。我加了;不同的地方,看看是否可行,但我没有得到答案。我知道我所有的子查询都返回正确的值,我只需要让减号运算符起作用即可。

谢谢:)

2 个答案:

答案 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栏。