Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.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
SQL选择语句_Sql_Mysql - Fatal编程技术网

SQL选择语句

SQL选择语句,sql,mysql,Sql,Mysql,我认为这是一个非常基本的问题,我已经在网站上搜索过了,但我不确定要搜索什么才能找到答案 我有一个SQL表,看起来像: studentId period class 1 1 math 1 2 english 2 1 math 2 2 history 我正在寻找一个SELECT语句,它可以找到正在上数学第一节课和英语第二节课的学生ID。我尝试过类似于选择stu

我认为这是一个非常基本的问题,我已经在网站上搜索过了,但我不确定要搜索什么才能找到答案

我有一个SQL表,看起来像:

studentId  period  class  
1          1       math  
1          2       english  
2          1       math  
2          2       history
我正在寻找一个SELECT语句,它可以找到正在上数学第一节课和英语第二节课的学生ID。我尝试过类似于
选择studentID WHERE(period=1和class=“math”)和(period=2和class=“english”)
的方法,但没有成功

我还考虑将我的桌子改为:

studentId  period1  period2  period3  period4  period5 etc  
但我想除了课后活动之外,我还想添加一些东西,并且希望能够轻松地扩展,而不必不断地添加专栏

谢谢你能给我的任何帮助。

试试以下方法:

select studentid from table where ( period = 1 AND class= "math" ) or ( period = 2 AND class = 
"english" ) group by studentid having count(*) >= 2

其思想是选择所有符合第一个条件或第二个条件的人,按人分组,并通过检查分组的行数来查看在哪里符合所有条件。您可以使用子查询单独执行每个查询,并仅在两个子查询匹配的情况下获得结果

Select StudentId FROM table WHERE 
    StudentId IN 
       (SELECT studentID FROM table WHERE ( period = 1 AND class= "math" ) ) 
AND 
    StudentId IN 
       (SELECT studentID FROM table WHERE ( period = 2 AND class= "english" ) ) 
编辑-添加

我自己并没有测试过这个,但我对性能方面的考虑很好奇,所以我查了一下。我发现这句话:

许多Transact-SQL语句 包含子查询可以是 交替地表示为连接。 其他问题只能通过以下方式提出: 子查询。在Transact-SQL中,有 通常没有性能差异 在包含 子查询与语义等价 不存在的版本。然而,在 某些情况下,存在必须 如果选中,则联接会产生更好的结果 演出否则,嵌套的 必须为每个查询处理查询 外部查询的结果以确保 消除重复。这样 在这种情况下,连接方法将产生 更好的结果。下面是一个例子 显示子查询和选择的示例 和一个返回相同值的联接选择 结果集:


此处:

您还可以进行自连接

SELECT  t1.studentID  
FROM table t1
JOIN table t2 ON t1.studentID = t2.studentID   
WHERE ( t1.period = 1 AND t1.class= "math" )    
  AND ( t2.period = 2 AND t2.class = "english" ) 

没错,但有点过分了,不是吗D但+1用于提供正确的子查询示例不需要有两个子查询,但是-一个子查询可以合并到顶级查询中。@Joe Hopfgartner:他想要的是INTERSECT,David的方法是intersect.true@margin的标准公式,但我喜欢这个答案,因为它非常清楚地展示了一种不同的方法,并且子查询实际上无论如何都不是选择的武器!但是理解不同的可能性是很重要的,因此最好将它们尽可能地简单化。@Joe Hopfgartner,这可能有些过分,如果性能成为一个问题,就不应该使用它,但为了代码的清晰性,我认为它非常好。你的回答也很好,但就我个人而言,如果我是一名维护程序员,需要对其进行调整,我必须考虑一下。然而,我确实投票支持你,因为它肯定会奏效。在找到那篇文章后,我打算把它作为第二种可能性加入我的答案中,但你抢先了我一步。美好的