MySQL:相交于同一个table

MySQL: Intersect in the same table

单凭标题很难描述。 假设我们有 3 个 tables:一个与学生有关,一个与老师有关,第三个称为教学,其中每个学生都与他们的老师相关联,如下所示:

+------+------+
| s_id | t_id |
+------+------+
| s1   | t1   |
+------+------+
| s1   | t2   |
+------+------+
| s1   | t3   |
+------+------+
| s2   | t1   |
+------+------+
| s2   | t2   |
+------+------+
| s2   | t4   |
+------+------+

在此示例中,学生 s1 有老师 t1、t2 和 t3,而学生 s2 有老师 t1、t2 和 t4。

现在的问题是:给定两个学生 s1 和 s2,他们共有多少位老师? 答案是 2(t1 和 t2)。

+------+
| t1   |
+------+
| t2   |
+------+

现在我不知道如何通过查询来做到这一点。 Intersect 不起作用,在尝试将 table 与自身进行内部连接后,我完全没有想法。

它应该与这样的子查询一起工作:

SELECT t_id FROM teaching WHERE s_id = 's1'
AND t_id IN
(SELECT t_id FROM teaching WHERE s_id = 's2');

您也可以像这样使用内部联接(下面的演示已更新):

SELECT t1.t_id FROM teaching t1
INNER JOIN teaching t2 ON (t1.t_id = t2.t_id)
WHERE t1.s_id = 's1' AND t2.s_id = 's2'

DEMO HERE

所以下面的查询有效:

SELECT count(*) 
FROM teaching 
WHERE s_id = "s1" 
AND t_id IN (SELECT t_id FROM teaching WHERE s_id = "s2")

但是性能很糟糕,仅仅一个数据库样本就需要大约7-8秒

你可以试试下面的方法

SELECT t.t_id 
FROM teaching AS t
INNER JOIN teaching AS t1 ON t.t_id = t1.t_id AND t1.s_id = 's2'
WHERE t.s_id = 's1'

http://sqlfiddle.com/#!9/6be321f/14