Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.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请求的交集。我试过很多命令,但还是卡住了 以下是三个请求 有人有办法帮我吗 一, 二, 三, 可以使用联接轻松重写INTERSECT: SELECT t1.username from ( SELECT username FROM mdl_user INNER JOIN mdl_quiz_grades ON mdl_user.id=mdl_quiz_grades.userid WHERE mdl_quiz_grades.quiz = 17

我正在尝试获取几个SQL请求的交集。我试过很多命令,但还是卡住了

以下是三个请求

有人有办法帮我吗

一,

二,

三,


可以使用联接轻松重写INTERSECT:

SELECT t1.username
from 
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 17
 ) as t1
join
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 16
 ) as t
on t1.username = t2.username
join
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 15
 ) as t3
on t1.username = t3.username
但在您的例子中,它几乎是相同的查询,只是不同的WHERE条件。您可以应用聚合逻辑:

SELECT username
FROM mdl_user
INNER JOIN mdl_quiz_grades
ON mdl_user.id=mdl_quiz_grades.userid
WHERE mdl_quiz_grades.quiz in (15,16,17)
GROUP BY username
HAVING COUNT(*) = 3
如果同一用户ID可能多次进行相同的测验,则需要应用DISTINCT:

HAVING COUNT(DISTINCT quiz) = 3

考虑提供一些样本数据和预期结果。
SELECT t1.username
from 
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 17
 ) as t1
join
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 16
 ) as t
on t1.username = t2.username
join
 (
   SELECT username
   FROM mdl_user
   INNER JOIN mdl_quiz_grades
   ON mdl_user.id=mdl_quiz_grades.userid
   WHERE mdl_quiz_grades.quiz = 15
 ) as t3
on t1.username = t3.username
SELECT username
FROM mdl_user
INNER JOIN mdl_quiz_grades
ON mdl_user.id=mdl_quiz_grades.userid
WHERE mdl_quiz_grades.quiz in (15,16,17)
GROUP BY username
HAVING COUNT(*) = 3
HAVING COUNT(DISTINCT quiz) = 3