选择具有最大公共值数的两个项目

时间:2015-03-18 10:25:55

标签: mysql

我有下表:

    +----+-----------+-----------+
    | id | teacherId | studentId |
    +----+-----------+-----------+
    |  1 |         1 |         4 |
    |  2 |         1 |         2 |
    |  3 |         1 |         1 |
    |  4 |         1 |         3 |
    |  5 |         2 |         2 |
    |  6 |         2 |         1 |
    |  7 |         2 |         3 |
    |  8 |         3 |         9 |
    |  9 |         3 |         6 |
    | 10 |         1 |         6 |
    +----+-----------+-----------+

我需要一个查询来查找两个具有最大普通studentId数量的teacherId。 在这种情况下,拥有teacherIds 1,2的教师有普通学生,其中学生ID为2,1,3,大于1,3的普通学生6。 在此先感谢!

[编辑]:几个小时后我得到了以下解决方案:

SELECT * FROM (
    SELECT r1tid, r2tid, COUNT(r2tid) AS cnt
    FROM (
        SELECT r1.teacherId AS r1tid, r2.teacherId AS r2tid
        FROM table r1
        INNER JOIN table r2 ON r1.studentId=r2.studentId AND r1.teacherId!=r2.teacherId
        ORDER BY r1tid
    ) t
    GROUP BY r1tid, r2tid
    ORDER BY cnt DESC
    ) t GROUP BY cnt ORDER BY cnt DESC LIMIT 1;

我确信必须存在更多简短而优雅的解决方案,但我找不到它。

2 个答案:

答案 0 :(得分:0)

你可以通过自我加入来做到这一点。假设表中没有重复:

select t.teacherid, t2.teacherid, count(*) as NumStudentsInCommon
from table t join
     table t2
     on t.studentid = t2.studentid and
        t.teacherid < t2.teacherid
group by t.teacherid, t2.teacherid
order by NumStudentsInCommon desc
limit 1;

如果您有重复项,则只需将count(*)替换为count(distinct studentid),但count(distinct)需要更多工作。

答案 1 :(得分:0)

select t.teacherId, t2.teacherId, sum(t.studentId) as NumStudentsInCommon
  from table1 t join
   table1 t2
 on t.studentId = t2.studentId and
    t.teacherId < t2.teacherId
 group by t.teacherId, t2.teacherId
 order by NumStudentsInCommon desc