1

希望有人可以帮助我..

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

对于名人堂,我想对声誉最高的成员进行看法。并在头像下方添加声誉。

因此我想总结一下: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

歌曲评论

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

课程评论

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
4

2 回答 2

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 示例- 感谢@Linger 的设置)
我对 mySQL 的了解不够多,不知道这是否会更适合您的情况。请注意,该LIMIT子句应该不是问题,因为无论如何您都希望它们被订购。此外,如果您在每个“子”表中都没有索引poster_id,您可能会想要它们......

于 2013-10-09T03:14:45.837 回答
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
于 2013-10-04T15:06:26.123 回答