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'
所以下面的查询有效:
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'
单凭标题很难描述。 假设我们有 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'
所以下面的查询有效:
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'