Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 错误语法_Mysql_Sql - Fatal编程技术网

Mysql 错误语法

Mysql 错误语法,mysql,sql,Mysql,Sql,我正在尝试从该站点向以下内容编写sql查询 物理学奖是在哪几年获得的 获奖但没有化学奖。 警告-这个问题太复杂了 很难达到这个水平,你需要 使用子查询或联接 第一次尝试: with c as (select yr, subject from nobel where subject <> 'Chemistry') select yr from c group by yr having c.subject ='Physics' 但我得到一个语法错误: 您的SQL语法有错误; 检查相应

我正在尝试从该站点向以下内容编写sql查询

物理学奖是在哪几年获得的 获奖但没有化学奖。 警告-这个问题太复杂了 很难达到这个水平,你需要 使用子查询或联接

第一次尝试:

with c as
(select yr, subject
from nobel
where subject <> 'Chemistry')

select yr
from c
group by yr
having c.subject ='Physics'
但我得到一个语法错误:

您的SQL语法有错误; 检查相应的手册 您的MySQL服务器版本 将near'与c一起使用的正确语法 选择yr,从何处获得诺贝尔奖的主题 第1行的“化学”科目

怎么了

第二次尝试:

select o.yr
from 
(select yr, subject
from nobel
where subject <> 'Chemistry') o
group by o.yr
having o.subject ='Physics'
但我得到一个语法错误:

“having”中的未知列“o.subject” 条款'

怎么了

第三次尝试:
如何使用JOIN来实现这一点?

这是一个正确的答案,但我仍然希望理解我的错误

   select distinct yr
    from nobel
    where subject = 'Physics'
    and yr not in (select yr from nobel where subject = 'Chemistry')

第一个查询中的问题是having子句。此处只能在列上使用聚合

所以这些会起作用

;with c as 
(select yr, subject from nobel where subject <> 'Chemistry')  
select yr,count(c.subject) from c where c.subject ='Physics'  group by yr 

;with c as 
(select yr, subject from nobel where subject <> 'Chemistry')  
select yr,count(c.subject) from c group by yr  having count(c.subject) =1
与第二个问题相同


无需子选择,也可以获得相同的结果。以下是它在MySQL中的实现方式:

SELECT yr
FROM nobel
GROUP BY yr
HAVING COUNT(subject = 'Chemistry' OR NULL) = 0
   AND COUNT(subject ='Physics' OR NULL) = 1

您的标签显示tsql表示Microsoft SQL Server,但您的错误显示MySQL Server,我猜它位于此网站的后面。我猜MySQL不支持CTE。提示:EXISTS是您的朋友我如何更改此帖子标签?无论CTE如何,Have都会在MySQL中的任何RDBMSNo CTE中给您带来相同的问题,我已经重新标记了您的问题。如果出现问题,您可以通过单击帖子下的编辑链接来修复。因此,我可以得出结论:分组时–在have和selectPlease中始终使用agg,CTE查询不需要以分号开头。前面的语句需要以分号结尾。@Pierre Alain:您的断言的问题是SQL语句不需要以分号结尾。因此,出于防御性编码的目的,人们有时会将它们放在需要与前一条语句分隔的语句的开头。在这样的地方尤其如此,因为你不知道代码将粘贴到哪里。我认为最好还是先解决一个不可避免的问题:为什么我的解析器说我需要一个处于萌芽状态的分号,把它放在前面。您最初的CTE解决方案在SQL Server中应该是正确的。但是MySQL不支持CTE,因此需要一个不同的解决方案。