Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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_Join - Fatal编程技术网

Mysql 仅用于选择两个主题的复杂联接

Mysql 仅用于选择两个主题的复杂联接,mysql,sql,join,Mysql,Sql,Join,我正在MySQL中做一个项目。我有一个关于加入的问题 +---+-----------+-----------+ |id | name | elective | +---+-----------+-----------+ | 1 | Jone | Math | | 2 | Jane | Math | | 3 | Doe | Math | | 4 | Bloggs | Math | | 5 | Peter

我正在MySQL中做一个项目。我有一个关于加入
的问题

+---+-----------+-----------+
|id | name      | elective  |
+---+-----------+-----------+
| 1 | Jone      | Math      |
| 2 | Jane      | Math      |
| 3 | Doe       | Math      | 
| 4 | Bloggs    | Math      |
| 5 | Peter     | Math      | 
| 6 | Chris     | Math      | 
| 7 | Mark      | Math      | 
| 3 | Doe       | Physics   | 
| 4 | Bloggs    | Physics   |
| 5 | Peter     | Physics   | 
| 6 | Chris     | Physics   | 
| 7 | Mark      | Physics   | 
| 5 | Peter     | Chemistry | 
| 6 | Chris     | Chemistry | 
| 7 | Mark      | Chemistry | 
+---+-----------+-----------+
在上表中,很少有人选择了两个以上的科目,很少有人选择了两个以上的科目。其他人只选择了一个主题

但我只想显示第二个,即只学习过两门课程的人。这是我想使用内部联接得到的

SELECT id, name, COUNT(elective) FROM table GROUP BY id, name HAVING COUNT(elective) = 2

仅使用
连接
如请求的OP:

select t1.id, t1.name
from tablename t1
inner join tablename t2 on t2.id = t1.id and t2.name = t1.name and t2.name <> t1.name
left outer join tablename t3 on t3.id = t2.id and t3.name <> t1.name and t3.name <> t2.name
where t3.name is null
选择t1.id,t1.name
来自表名t1
t2.id=t1.id和t2.name=t1.name和t2.name t1.name上的内部联接表名t2
t3.id=t2.id和t3.name t1.name和t3.name t2.name上的左外联接表名t3
其中t3.name为空
t1
t2
为同一
id/人
选择两种不同的
选修课
。表
t3
将选择另一个
选项
。当我在
where
子句中输入我希望
t3.name
NULL
时,这意味着它不存在第三个与先前选择的
选项不同的
选项

如果存在第三个名称,
where
子句将删除那些
名称

两个
内部联接
用于
选择
至少两个不同的
选修课


仅使用
连接
如请求的OP:

select t1.id, t1.name
from tablename t1
inner join tablename t2 on t2.id = t1.id and t2.name = t1.name and t2.name <> t1.name
left outer join tablename t3 on t3.id = t2.id and t3.name <> t1.name and t3.name <> t2.name
where t3.name is null
选择t1.id,t1.name
来自表名t1
t2.id=t1.id和t2.name=t1.name和t2.name t1.name上的内部联接表名t2
t3.id=t2.id和t3.name t1.name和t3.name t2.name上的左外联接表名t3
其中t3.name为空
t1
t2
为同一
id/人
选择两种不同的
选修课
。表
t3
将选择另一个
选项
。当我在
where
子句中输入我希望
t3.name
NULL
时,这意味着它不存在第三个与先前选择的
选项不同的
选项

如果存在第三个名称,
where
子句将删除那些
名称



两个
内部连接
存在于
选择
至少两个不同的
选修课

为什么有人会破坏我的一个好编辑?现在看起来很糟糕。请修复表结构。数据可以用多种方式解释:(为什么有人会破坏我的编辑?现在看起来很糟糕。请修复表结构。数据可以用多种方式解释:(好吧,这是制作表的人的问题,它不符合DB结构的3级,应该立即重新考虑。它显然应该只包含
个人id、主题id
,并且有外键。你的比我的更不正确,但我得到了缺点,因为我的声誉较低。似乎公平:/o你认为呢对于我的新查询:PWell,这是制作表的人的问题,它不符合DB结构的第3类,应该立即重新考虑。它显然应该只包含
个人id、主题id
,并且有外键。你的比我的更不正确,但我得到了缺点,因为我的声誉较低。似乎公平:/whaI don’你不认为我的新查询是正确的,但你的查询也不起作用,因为可能有两个人同名。很高兴我们一致认为表结构很糟糕,需要修复。顺便说一下,只需在表中放入另一个
6 Mark Math
,你的查询就会被销毁:)您需要根据id而不是人名进行分组。这毫无意义。现在我明白了,您的查询是正确的。他对同一个人有相同的id。@balamurugan为什么要这样做?恕我冒犯,但您的查询也不起作用,因为可以有两个同名的人。很高兴我们一致认为表结构非常糟糕nd需要修复。顺便说一句,只需在表中放入另一个
6马克数学
,您的查询就会被销毁:)您需要根据id而不是人名进行分组。这毫无意义。现在我明白了,您的查询是正确的。他对同一个人有相同的id。@balamurugan为什么要这样?