1

私は3つのテーブルを持っています:users、、。Courseusersは、courses.idCourseとusers.idUserを結合する中間テーブルです。ただし、中間テーブルには外部キー制約やがありません。coursescourseusersON DELETE CASCADEON UPDATE CASCADE

Users:
idUser|name

Courses:
idCourse|name

Courseusers:
id|idUser|idCourse

私の質問は、テーブルcourseuserから手動で削除されたユーザーを無視しながら、最も購読されている上位3つのコース(のほとんどのエントリ)を取得するにはどうすればよいですか(それらはのエントリとして引き続き存在します)。userscoursescourseuser

私が今持っているもの:

SELECT c.idCourse, c.name, count(*) as count 
FROM courseusers as cu 
     JOIN course as c 
         ON cu.idCourse=c.idCourse 
     JOIN users as usr 
         ON (usr.idUser=u.idUser) 
GROUP BY u.idCourse
ORDER BY count DESC 
LIMIT 3
4

4 に答える 4

3

http://sqlfiddle.com/#!2/0567a/1

SELECT
  c.name,
  COUNT(1) AS total
FROM Courceusers cu
JOIN Cources c USING(idCource)
JOIN Users u USING(idUser)
GROUP BY 1
ORDER BY 2 DESC
LIMIT 3;
于 2012-09-07T07:37:21.427 に答える
3

次のクエリを使用してみてください

SELECT c.idCourse, c.name, count(*) as count  
FROM courseusers as cu  
   LEFT JOIN course as c  
       ON cu.idCourse=c.idCourse  
   LEFT JOIN users as usr  
       ON (usr.idUser=u.idUser)  
GROUP BY u.idCourse 
ORDER BY count DESC  
LIMIT 3 
于 2012-09-07T08:28:20.303 に答える
1

Users中間テーブルではなく、テーブルに基づいてすべてのテーブルを結合します

SELECT  a.idUser, a.Name, COUNT(c.idCourse) totalCount
FROM    Users a
            INNER JOIN  CourseUsers b
                ON a.idUser = b.idUser
            INNER JOIN Courses c
                ON b.idCourse = c.idCourse
GROUP BY a.idUser, a.Name
ORDER BY totalCount DESC
LIMIT 3
于 2012-09-07T07:42:19.570 に答える
1
select 
    CourseUsers.idCourse, 
    Courses.name, 
    COUNT(distinct CourseUsers.idUser) as Subscribers
from CourseUsers
    inner join Courses on CourseUsers.idCourse = Courses.idCourse
    inner join Users on CourseUsers.idUser = Users.idUser
group by CourseUsers.idCourse, Courses.name
order by Subscribers desc
limit 3
于 2012-09-07T08:25:23.123 に答える