Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.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 用于两个表的并集的Sql查询_Mysql - Fatal编程技术网

Mysql 用于两个表的并集的Sql查询

Mysql 用于两个表的并集的Sql查询,mysql,Mysql,我被一个问题难住了。我有两个表,两个表都有一个共同的列,但两个表中的数据可能不同: 表1 +---------+------------+ | Sub | student_id | +---------+------------+ | Math | 0033 | | Science | 0034 | | Geom | 0035 | | Math | 0034 | +---------+------------+ 表2 +

我被一个问题难住了。我有两个表,两个表都有一个共同的列,但两个表中的数据可能不同:

表1

+---------+------------+
|   Sub   | student_id |
+---------+------------+
| Math    | 0033       |
| Science | 0034       |
| Geom    | 0035       |
| Math    | 0034       |
+---------+------------+
表2

+---------+----------+
|   Sub   | class_id |
+---------+----------+
| Science | 001      |
| Geom    | 002      |
| Geom    | 001      |
| Civics  | 004      |
+---------+----------+
现在,我需要以下方式得到结果:

+---------+----------------+--------------+
|   Sub   | Student(count) | Class(count) |
+---------+----------------+--------------+
| Math    | 2              | 0            |
| Science | 1              | 1            |
| Geom    | 1              | 2            |
| Civics  | 0              | 1            |
+---------+----------------+--------------+
我想我必须使用union,我可以在两个不同的查询中得到结果,但是我不能像上面那样显示最终的表

这就是我所拥有的:

select sub,count(*)as student_id from tab1
group by sub
union
select sub,count(*)as class_id from tab2
group by sub
但是我从中得到了2匹而不是3匹

任何帮助都将不胜感激。

试试这个

SELECT AllSubs.Sub as Sub,
       COUNT(DISTINCT tab1.Student_Id) as "Student(Count)",
       COUNT(DISTINCT tab2.Class_Id) as "Class(Count)"
FROM
(SELECT DISTINCT Sub FROM tab1
UNION
SELECT DISTINCT Sub FROM tab2)AllSubs
LEFT JOIN tab1 ON tab1.Sub = AllSubs.Sub
LEFT JOIN tab2 ON tab2.Sub = AllSubs.Sub
GROUP BY AllSubs.Sub

查询从tab1和tab2中选择所有不同的主题,然后与tab1和tab2左连接,然后统计不同的学生id和按主题分组的不同类id

更新


如果您只需要第一行,只需在查询末尾添加
LIMIT 1

非常好,非常感谢。现在,如果我必须扩展它来找到学生(计数)和班级(计数)的比率,我必须找到不同的地方,不知道你所说的学生(计数)和班级(计数)的比率是什么意思。如果你愿意,你可以选择这些值并对它们进行数学运算。你希望看到什么样的值(在另一列?)输出该科目注册学生与拥有该技能的班级比例最高的科目名称。我仍然不知道你的意思,你能给我看一下你的预期结果集吗?输出该科目注册学生比例最高的科目名称和该科目的班级名称。。。。所以在上面的例子中,我们应该得到的结果仅仅是学科数学。因为我们有两个学生参加,但没有课堂教学。简言之,我需要学生人数和班级人数差异最大的科目。
SELECT AllSubs.Sub as Sub,
       COUNT(DISTINCT tab1.Student_Id) as "Student(Count)",
       COUNT(DISTINCT tab2.Class_Id) as "Class(Count)",
       COUNT(DISTINCT tab1.Student_Id) - COUNT(DISTINCT tab2.Class_Id) as difference
FROM
(SELECT DISTINCT Sub FROM tab1
UNION
SELECT DISTINCT Sub FROM tab2)AllSubs
LEFT JOIN tab1 ON tab1.Sub = AllSubs.Sub
LEFT JOIN tab2 ON tab2.Sub = AllSubs.Sub
GROUP BY AllSubs.Sub
ORDER BY difference DESC