0

Need suggestions on a MS SQL query:

table: students

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

table: class

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

Desired output

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 つのテーブルを作成するなどしてテーブルを正規化し、

学生

  • ID(PK)
  • 名前

クラス

  • ID(PK)
  • 名前

学生クラス

  • 学生証 (FK)
  • クラス ID (外部キー)

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

SQLServerの答えは次のとおりです。

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 に答える