Mysql 在不使用联接的情况下,从不同类型的表中选择列

Mysql 在不使用联接的情况下,从不同类型的表中选择列,mysql,sql,database,join,Mysql,Sql,Database,Join,我有一个表'teachers',其列为(tid,tname) 我有一个表'students',它的列是(sid,sname)。假设它们有m:n关系,我还有一个表t_s(tid,sid),其中tid和sid分别引用教师的tid和学生的sid。 现在我想找到:老师的名字(以及他们的tid)和每个老师手下的学生人数。[不使用连接或笛卡尔乘积] 以下查询返回带有tid的计数: SELECT t.tid, count(*) as numberofstudents FROM t_s t GROUPBY by

我有一个表'teachers',其列为(tid,tname) 我有一个表'students',它的列是(sid,sname)。假设它们有m:n关系,我还有一个表t_s(tid,sid),其中tid和sid分别引用教师的tid和学生的sid。 现在我想找到:老师的名字(以及他们的tid)和每个老师手下的学生人数。[不使用连接或笛卡尔乘积]

以下查询返回带有tid的计数:

SELECT t.tid, count(*) as numberofstudents
FROM t_s t
GROUPBY by t.tid;
我将如何将tname与各自的tid进行匹配,并与union进行了尝试:

SELECT t.tid, count(*) as numberofstudents
FROM t_s t
GROUP BY t.tid
UNION
SELECT t1.tid,t1.tname
FROM teachers t1
WHERE t1.tid in (SELECT t2.tid
                FROM t_s t2 )
发现它不起作用,因为列类型不同

有没有办法做到这一点?
谢谢大家!

尝试使用虚拟列

SELECT t.tid, '' as teachername, count(*) as numberofstudents
FROM t_s t
GROUP BY t.tid
UNION
SELECT t1.tid,t1.tname, 0
FROM teachers t1
WHERE t1.tid in (SELECT t2.tid
                FROM t_s t2 )

我也很好奇为什么

不使用连接或笛卡尔积

但是,您可以尝试以下方法:

SELECT 
    t.tid,
    COUNT(*) as numberofstudents,
    (SELECT t1.tname FROM teachers t1 WHERE t1.tid = t.tid) AS tname
FROM t_s t
GROUP BY by t.tid;

为什么没有连接?避免连接有点反常。这纯粹是表象吗?你想要一个教师姓名的标题行,然后在下面(而不是旁边)显示他们的计数?@MatthewCawley,谢谢你的回答。没有连接,因为这是一种作业,查询输出必须是:(tid,tname,numberofstundents),嘿@P.Salmon我试过了,但结果是无组织的。我怀疑您需要将其包装在外部查询中,然后按tid和学生人数排序。如果希望教师最后一位,则在查询的教师部分将0更改为非常高的数字。