Mysql SQL查询以查找具有两个或更多特定主题的所有学生

Mysql SQL查询以查找具有两个或更多特定主题的所有学生,mysql,Mysql,我需要找到班上所有有英语和数学书的学生 表结构简单 Student ========================== id | First Name | Last Name 1 | Akhil | Kumar 2 | Nikhil | Tylagi 3 | Pawan | Benarjee Student Books ========================== id | student_id | book

我需要找到班上所有有英语和数学书的学生

表结构简单

Student    
==========================
id |  First Name  | Last Name

1  |  Akhil       | Kumar
2  |  Nikhil      | Tylagi
3  |  Pawan       | Benarjee


Student Books    
==========================
id |  student_id  | book

1  |  1      | Eng
2  |  2      | Maths
3  |  3      | Physics
4  |  1      | Maths
5  |  2      | Physics
6  |  3      | Eng
我能创造的是:

SELECT student_id
from student_books OStu
WHERE book = "Eng" AND (SELECT book FROM student_books
                        WHERE book = "Maths" AND student_id = OStu.student_id);
阿基尔是唯一一个应该被找回的人

Expected Result should be    
=====================================
student_id |  First Name  | Last Name
=====================================
1          |  Akhil       | Kumar
现在的问题是,如果有人想询问学生是否有(英语、数学、物理,比如说30本书)


有没有更好的办法。(您可以使用
HAVING
子句仅筛选同时拥有
数学
英语
的人:

SELECT t.student_id
FROM student_books t
WHERE t.Book IN('Maths','Eng')
GROUP BY t.student_id
HAVING COUNT(distinct t.book) = 2
如果您还想要他们的名字:

SELECT s.first_name,s.last_name,t.student_id
FROM student_books t
INNER JOIN Student s 
 ON(t.student_id = s.id)
WHERE t.Book IN('Maths','Eng')
GROUP BY t.student_id, s.first_name,s.last_name
HAVING COUNT(distinct t.book) = 2
如果您想要传统书籍,只需使用
WHERE
have
,对于3,将它们更改为:

WHERE t.Book IN('Maths','Eng','Physics')
HAVING COUNT(distinct t.book) = 3

您应该使用内部联接或等效联接。查询时间最快,结果相同

//option1
SELECT Student.Id AS student_id,
Student.FirstName,
Student.LastName
FROM Student, StudentBooks  
WHERE Student.Id = StudentBooks.Id AND
StudentBooks.book IN ('Eng', 'Maths')
GROUP BY Student.Id

//option2
SELECT Student.Id AS student_id,
Student.FirstName,
Student.LastName
FROM Student INNER JOIN StudentBooks ON (Student.Id = StudentBooks.Id)
WHERE
StudentBooks.book IN ('Eng', 'Maths')
GROUP BY Student.Id

如果您需要有英语、数学和物理书籍的学生,请尝试此项

SELECT 
    *
FROM
    Student
        JOIN
    student_books ON Student.id = student_books.student_id
WHERE
    student_books.book = 'Maths' AND student_books.book = 'Eng' AND student_books.book = 'Physics';
SELECT 
    *
FROM
    Student
        JOIN
    student_books ON Student.id = student_books.student_id
WHERE
    student_books.book = 'Maths' AND student_books.book = 'Eng';
否则,如果您需要英语、数学书籍的学生

SELECT 
    *
FROM
    Student
        JOIN
    student_books ON Student.id = student_books.student_id
WHERE
    student_books.book = 'Maths' AND student_books.book = 'Eng' AND student_books.book = 'Physics';
SELECT 
    *
FROM
    Student
        JOIN
    student_books ON Student.id = student_books.student_id
WHERE
    student_books.book = 'Maths' AND student_books.book = 'Eng';

这应该可以解决您的问题。请注意,我们正在对student_books表的三个副本进行自联接:

SELECT sb1.id,
FROM student_books sb1
INNER JOIN student_books sb2 ON (sb1.studentid = sb2.studentid) AND (sb1.book <> sb2.book)
INNER JOIN student_books sb3 ON (sb1.studentid = sb3.studentid) AND (sb1.book <> sb3.book) AND (sb2.studentid <> sb3.studentid)
WHERE sb1.book  = "Maths" AND sb2.book  = "English" AND sb3.book  = "Physics"
选择sb1.id,
来自学生用书sb1
内部连接学生书籍sb2 ON(sb1.studentid=sb2.studentid)和(sb1.book sb2.book)
内部连接学生书籍sb3 ON(sb1.studentid=sb3.studentid)和(sb1.book sb3.book)和(sb2.studentid sb3.studentid)
其中sb1.book=“数学”和sb2.book=“英语”以及sb3.book=“物理”

显示预期结果!
student_books
student books
?第二个查询无效。(改为进行自连接!)@jarlh我缺少什么?:按问题分组。至少较新的MySQL版本不会运行该查询。(可能较旧版本会运行,返回不可预测的结果。)一般的GROUP BY规则是:如果指定了GROUP BY子句,则SELECT列表中的每个列引用都必须标识一个分组列或是一个集合函数的参数。是的,但对于Oracle、SQL Server……而不是MySQL,这是正确的。MySQL可能会弄乱结果,但只有在有多个选项时才会发生。这就是情况并非如此。@jarlhdinct应该是多余的,因为应该在(学生id,书本)上形成一个唯一的键-事实上,这是一个有效的主键,使id过时。一个列怎么可能同时包含两个或三个值?好吧,我没有投反对票,这个答案会起作用。请注意,您正在进行两个不必要的联接,并且在不签出
sb1.book
sb2.book
…的情况下将结果乘以很多向下投票也可以。这可以完成任务,但效率很低。想象一下,如果你想要8本书会发生什么。加上@GaborSch的一本,查询应该是有效的,这只是一个例子,实际上我必须通过编程为n本书生成查询。写起来很乏味,但不是很低效。我理解,我已经添加了额外的pr我相信我的查询对于更少的书(如3本)会很有效,尽管它不会扩展到更多的书(如8本)没有一个好的数据库可以在同一个表上做一个完整的交叉乘积,然后一个接一个地考虑谓词,这也返回那些有电子书但没有数学书的学生,