希望有人可以帮助我..
对于我的忠诚度计划,我会计算添加的歌曲数量,加入的课程数量,课程和歌曲的评论数量等等。
对于名人堂,我想了解最高声誉的成员。并且还会增加头像的声誉。
因此我想总结一下: 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
答案 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
的索引,那么您可能会想要它们......