0

需要有关 MS SQL 查询的建议:

表:学生

id  name    class
--  ----    -----
1   John    Math, Biology
2   Jane    English
3   Mark    Math

表:类

id  name
--  ----
1   Math
2   English
3   Biology
4   History

期望的输出

name        count
----        -----
Math        2
English     1
Biology     1
History     0
4

3 回答 3

2

这是为了MySQL.

SELECT  a.name, COUNT(b.id) as `totalCount`
FROM    class a
        LEFT JOIN students b
            ON FIND_IN_SET(a.name, b.class) > 0
GROUP   BY a.name

为了获得最佳性能,请通过创建 3 个表来规范化表,

学生们

  • 身份证(PK)
  • 姓名

班级

  • 身份证(PK)
  • 姓名

学生班

  • 学生证 (FK)
  • 类 ID (FK)

这是一种many-to-many关系,因为学生可能有很多班级,而班级也有很多学生。

查询应该是这样的,

SELECT  a.Name, COUNT(b.ClassID) totalCount
FROM    Class a
        LEFT JOIN StudentClass b
          ON a.id = b.ClassID
GROUP   BY a.Name
于 2013-02-27T16:27:54.633 回答
1

这是 SQL Server 的答案:

SELECT  c.name, COUNT(b.id) as `totalCount`
FROM class c LEFT JOIN
     students s
     ON ','+s.class+',' like '%,'+a.name+',%'
GROUP BY c.name

实际上,这不适用于类名中的空格。试试这个on

     ON ','+replace(s.class, ' ', '')+',' like '%,'+replace(a.name, ' ', '')+',%'
于 2013-02-27T16:29:36.080 回答
1
select 
class.name as name, 
count(*) as count 
from students, class 
where students.class like '%'+class.name+'%' 
于 2013-02-27T16:36:36.583 回答