如何从多个表中求和多个计数

时间:2013-10-04 14:57:45

标签: mysql sql count sum

希望有人可以帮助我..

对于我的忠诚度计划,我会计算添加的歌曲数量,加入的课程数量,课程和歌曲的评论数量等等。

对于名人堂,我想了解最高声誉的成员。并且还会增加头像的声誉。

因此我想总结一下: TOTAL = totalsongs + totallesson + totalsongcomments + totallessoncomments

我的表格如下:

海报

poster_id| username | 
---------|----------|
1        | lisa
2        | john
3        | ben

lesson_id| title    | poster_id
---------|----------|----------
1        | lesson1  | 1
2        | lesson2  | 1
3        | lesson3  | 2
4        | lesson4  | 3
5        | lesson5  | 1
6        | lesson7  | 2

song_id  | title    | poster_id
---------|----------|----------
1        | song 1   | 1
2        | song 2   | 1
3        | song 3   | 2

SongComment

com_id   | song_id  | poster_id | comment
---------|----------|-----------|--------
1        | 1        | 1         | This comment1
2        | 2        | 1         | This comment2
3        | 3        | 2         | This comment3

LessonComment

com_id   | lesson_id| poster_id | comment
---------|----------|-----------|--------
1        | 1        | 1         | This comment1
2        | 2        | 1         | This comment2
3        | 3        | 2         | This comment3

请帮助设置mysql查询

    SELECT poster.gebruikersnaam 
    SUM(
        (SELECT COUNT(*) FROM song) AS totalsongs +
        (SELECT COUNT(*) FROM lesson AS totallesson + 
        (SELECT COUNT(*) FROM songcomment AS totalsongcomments +
        (SELECT COUNT(*) FROM lessoncomment AS totallessoncomments +
        )
    FROM song
    INNER JOIN poster ON poster.poster_id = song.song_poster_id
    WHERE song.song_poster_id !=  '0'
    GROUP BY poster.poster_id
    ORDER BY TOTAL
    LIMIT 0 , 250

这是好的但是仍然需要订购:)

SELECT P.poster_id,
  (SELECT COUNT(*) FROM song WHERE P.poster_id = song.song_poster_id) AS SongCount,
  (SELECT COUNT(*) FROM lesson WHERE P.poster_id = lesson.lesson_poster_id) AS LessonCount,
  (SELECT COUNT(*) FROM commentaar WHERE P.poster_id = commentaar.poster_id) AS SongCommCount,
  (SELECT COUNT(*) FROM lesson_comment WHERE P.poster_id = lesson_comment.lesson_comment_poster_id) AS LessonCommCount
FROM poster AS P
LIMIT 0, 50

编辑2

    SELECT PM.poster_id , PM.SongCount , PM.LessonCount, PM.SongCommCount, PM.LessonCommCount, (PM.SongCount + PM.LessonCount + PM.SongCommCount + PM.LessonCommCount) AS TotalCount 
FROM (
  SELECT P.poster_id, 
    (SELECT COUNT(*) FROM song WHERE P.poster_id = song.song_poster_id) AS SongCount, 
    (SELECT COUNT(*) FROM lesson WHERE P.poster_id = lesson.lesson_poster_id) AS LessonCount, 
    (SELECT COUNT(*) FROM commentaar WHERE P.poster_id = commentaar.poster_id) AS SongCommCount, 
    (SELECT COUNT(*) FROM lesson_comment WHERE P.poster_id = lesson_comment.lesson_comment_poster_id) AS LessonCommCount 
  FROM poster AS P 
  LIMIT 0, 50
) AS PM
ORDER BY (PM.SongCount + PM.LessonCount + PM.SongCommCount + PM.LessonCommCount) DESC

编辑3

    SELECT poster_id, 
       songCount, lessonCount, songCommentCount, lessonCommentCount,
       songCount + lessonCount + songCommentCount + lessonCommentCount as totalRank
FROM(SELECT poster.poster_id, 
            COALESCE(song.count, 0) as songCount,
            COALESCE(lesson.count, 0) as lessonCount,
            COALESCE(commentaar.count, 0) as songCommentCount,
            COALESCE(lesson_comment.count, 0) as lessonCommentCount
     FROM poster
     LEFT JOIN (SELECT song_poster_id, COUNT(*) as count
                FROM song
                GROUP BY song_poster_id) song
            ON song.song_poster_id = poster.poster_id  
     LEFT JOIN (SELECT lesson_poster_id, COUNT(*) as count
                FROM lesson
                GROUP BY lesson_poster_id) lesson
            ON lesson.lesson_poster_id = poster.poster_id
     LEFT JOIN (SELECT poster_id, COUNT(*) as count
                FROM commentaar
                GROUP BY poster_id) commentaar
            ON commentaar.poster_id = poster.poster_id
     LEFT JOIN (SELECT lesson_comment_poster_id, COUNT(*) as count
                FROM lesson_comment
                GROUP BY lesson_comment_poster_id) lesson_comment
            ON lesson_comment.lesson_comment_poster_id = poster.poster_id) Total
ORDER BY totalRank DESC
LIMIT 0, 50

2 个答案:

答案 0 :(得分:0)

以下SQL Fiddle显示以下查询确实有效。正如您所看到的,我正在创建表格并使用您在问题中的数据填充它们。然后我执行以下查询来收集您需要的数据。我确实验证了计数,并且计算正确。

SELECT PM.*, 
  (
    PM.SongCount + PM.LessonCount + 
    PM.SongCommCount + PM.LessonCommCount
  ) AS TotalCount 
FROM (
  SELECT P.poster_id, 
    (
      SELECT COUNT(poster_id) 
      FROM song S 
      WHERE P.poster_id = S.poster_id
    ) AS SongCount, 
    (
      SELECT COUNT(poster_id) 
      FROM lesson L 
      WHERE P.poster_id = L.poster_id
    ) AS LessonCount, 
    (
      SELECT COUNT(poster_id) 
      FROM SongComment SC 
      WHERE P.poster_id = SC.poster_id
    ) AS SongCommCount, 
    (
      SELECT COUNT(poster_id) 
      FROM LessonComment LC 
      WHERE P.poster_id = LC.poster_id
    ) AS LessonCommCount 
  FROM poster AS P 
  LIMIT 0, 50
) AS PM
ORDER BY 
  (
    PM.SongCount + PM.LessonCount + 
    PM.SongCommCount + PM.LessonCommCount
  ) DESC

答案 1 :(得分:0)

除了@Linger的回答,这是另一种常用方法:

SELECT poster_id, 
       songCount, lessonCount, songCommentCount, lessonCommentCount,
       songCount + lessonCount + songCommentCount + lessonCommentCount as totalRank
FROM(SELECT Poster.poster_id, 
            COALESCE(Song.count, 0) as songCount,
            COALESCE(Lesson.count, 0) as lessonCount,
            COALESCE(SongComment.count, 0) as songCommentCount,
            COALESCE(LessonComment.count, 0) as lessonCommentCount
     FROM Poster
     LEFT JOIN (SELECT poster_id, COUNT(*) as count
                FROM Song
                GROUP BY poster_id) Song
            ON Song.poster_id = Poster.poster_id  
     LEFT JOIN (SELECT poster_id, COUNT(*) as count
                FROM Lesson
                GROUP BY poster_id) Lesson
            ON Lesson.poster_id = Poster.poster_id
     LEFT JOIN (SELECT poster_id, COUNT(*) as count
                FROM SongComment
                GROUP BY poster_id) SongComment
            ON SongComment.poster_id = Poster.poster_id
     LEFT JOIN (SELECT poster_id, COUNT(*) as count
                FROM LessonComment
                GROUP BY poster_id) LessonComment
            ON LessonComment.poster_id = Poster.poster_id) Total
ORDER BY totalRank DESC
LIMIT 0, 50

(有一个工作SQL Fiddle example - 感谢@Linger的设置)
我对mySQL知之甚少,不知道这对你的情况是否更有效。请注意,LIMIT子句不应该是一个问题,因为您希望它们仍然需要它们。此外,如果您在每个'子'表中都没有poster_id的索引,那么您可能会想要它们......