【问题标题】:SQL error 1064: syntax error using containsSQL 错误 1064:使用包含的语法错误
【发布时间】:2018-10-22 05:15:41
【问题描述】:

我正在尝试在查询中使用运算符 contains,但出现此错误:

错误代码:1064。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的“包含(从 Musicians M2 where 中选择 ssn)附近使用正确的语法

我的查询应该获取每个名叫 John 的音乐家演奏的所有 instrID。意思是所有的约翰都用过这个乐器。 它说这是一个语法错误,我不知道错误在哪里。 这是我的 sql 查询:

select instrID
from Plays P
where (
  select ssn 
  from Musicians M
  where M.ssn = P.ssn
) contains (
  select ssn
  from Musicians M2
  where M.aname = 'John'
)

【问题讨论】:

  • 这个查询应该做什么?
  • 你能试试这个吗-select instrID from Plays P where ((select ssn from Musicians M where M.ssn = P.ssn) contains (select ssn from Musicians M2 where M.aname = 'John'))
  • 如果可能的话,可能会为这两个表添加一些示例数据。

标签: mysql sql


【解决方案1】:

CONTAINS MySQL 关键字仅适用于处理空间数据,因此不适用于您当前的查询。

我怀疑你真正需要的只是一个简单的连接:

SELECT p.instrID
FROM Plays p
INNER JOIN Musicians m
    ON p.ssn = m.ssn
WHERE m.aname = 'John';

【讨论】:

    【解决方案2】:

    这是相当复杂的。我会使用group byhaving 来解决这个问题:

    select p.instrID
    from Plays p join
         Musicians m
         on m.ssn = p.ssn
    where m.aname = 'John'
    group by p.instrID
    having count(*) = (select count(*) from Musicians m2 where m2.aname = 'John');
    

    having 子句满足所有名为“John”的音乐家演奏乐器的要求。

    【讨论】:

      【解决方案3】:

      你可以这样加入:

      select p.instrID
      from Plays P, Musicians m
      where p.ssn = m.ssn
      and m.aname = 'John';
      

      根据需求,您可以尝试left outer joinright outer join等。

      【讨论】:

      • 你应该使用显式连接
      • 没有这样的显式连接标准。两个连接都执行相同的显式或隐式
      • 逗号分隔的连接使其成为交叉连接 - 当您连接表时,最好以这种方式明确定义内连接/连接/左连接/右连接/完全连接
      • 没有没有这样的标准。内连接可以使用“=”来实现。它不是更好..它相同..
      【解决方案4】:

      你可以做其他情况

      Select instrID
      from Plays P
      where P.ssn in (
        select ssn 
        from Musicians M
        where 
        M.aname='John');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-27
        • 1970-01-01
        相关资源
        最近更新 更多