【问题标题】:select columns from different tables with different types without using joins从不同类型的不同表中选择列而不使用连接
【发布时间】:2017-02-05 08:36:11
【问题描述】:

这是我有一个表“教师”的情况,其列是 (tid, tname) 我有一个表'学生',其列是(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 )

发现它不起作用,因为列类型不同。

有没有办法实现它? 谢谢!

【问题讨论】:

  • 为什么没有连接?
  • 避免 JOIN 有点反常。
  • 纯粹是展示性的吗?您想要教师姓名的标题行,然后是他们下方的人数(而不是旁边)?
  • @MatthewCawley,感谢您的回复。没有加入,因为这是一种作业,查询输出必须类似于:(tid,tname,numberofstudents),

标签: mysql sql database join


【解决方案1】:

我也很好奇为什么

不使用联接或笛卡尔积

不过,你可以试试这个:

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;

【讨论】:

    【解决方案2】:

    尝试使用虚拟列

    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 )
    

    【讨论】:

    • 嘿@P.Salmon 我试过了,但结果是杂乱无章的
    • 会的。我怀疑您需要将其包装在外部查询中,然后按 tid 和学生人数排序。如果您希望最后一位教师,则在查询的教师部分中将 0 更改为一个非常高的数字。
    猜你喜欢
    • 2013-06-30
    • 2018-07-22
    • 2015-06-19
    • 2017-04-10
    • 2018-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 1970-01-01
    相关资源
    最近更新 更多