【问题标题】:mysql query count fieldsmysql查询计数字段
【发布时间】:2013-12-03 14:34:41
【问题描述】:

如果有人可以帮助我,我的 sql 查询会遇到一些麻烦。所以我有students、participants、courses、places、student_to_courses这些表格。我需要让所有学生参加特定课程,我正在处理这个查询

select 
  s.name as student_name, c.name as course_name, p.name as place_name
from 
  student_to_courses s2c, 
  students_participation sp, 
  students s,
  courses c,
  places p

where 
s.id = s2c.participation_id AND
s.id = sp.profile_id AND 
c.id = s2c.course_id AND
p.id = c.place_id = p.id AND
s2c.course_id = 1

这里是sqlfiddle

但我需要计算学生在特定地点的次数,例如 student_name, course_name, place_name, | 3 |。现在我用另一个查询来做这件事,我每次在我的循环中调用它。但我想知道是否有办法只使用单个查询来做到这一点。提前感谢所有愿意帮助我的人。

【问题讨论】:

    标签: mysql join count


    【解决方案1】:

    您可以只做一个COUNT(),然后按剩余的列分组:

    select s.name as student_name, 
           c.name as course_name, 
           p.name as place_name, 
           count(*)
    from students s
    inner join student_to_courses s2c on s.id = s2c.participation_id
    inner join courses c on c.id = s2c.course_id
    inner join places p on p.id = c.place_id
    inner join students_participation sp on s.id = sp.profile_id
    where s2c.course_id = 1
    group by s.name,c.name,p.name 
    

    我还将您的联接更改为显式联接,因为它更容易阅读且不易出错。

    sqlfiddle demo

    【讨论】:

    • 哇,这很快,是的,这应该可以,但是还有一件事我忘记了,我只需要将那些已经完成课程的人添加到我的计数中,所以当我添加 unix_timestamp(c .end)
    • 我不确定我是否理解您是想要左连接还是保持内连接并只计算一些。如果是第二个,请尝试使用SUM(CASE WHEN unix_timestamp(c.end) < time() THEN 1 ELSE 0 END) 而不是 COUNT(*)。
    【解决方案2】:

    试试这个:

    select 
      s.name as student_name, c.name as course_name, 
      p.name as place_name, count(*) qtd
    from 
      student_to_courses s2c, 
      students_participation sp, 
      students s,
      courses c,
      places p
    where 
       s.id = s2c.participation_id AND
       s.id = sp.profile_id AND 
       c.id = s2c.course_id AND
       p.id = c.place_id = p.id AND
       s2c.course_id = 1
    group by s.name, c.name, p.name
    

    count(*)AGGREGATE FUNCTION,请参阅此链接了解。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 2013-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多