[英]GROUP_CONCAT + SUM / COUNT in mysql not working
我有一些桌子喜歡
User : id , username
answers : id , answers , is_correct , question_id
user_answers : user_id , question_id , answer_id , date
questions : id , question , category
category : id name
現在我想做的是計算用戶在每個類別上給出的正確答案。 我的查詢是這樣
SELECT
u.`user_name` AS `UserName`,
u.`user_id` AS `UserId`,
sum(a.is_correct) AS `Score`,
group_concat(distinct c.name) AS `Quizes`
FROM users_answers ua
LEFT JOIN answers a
on a.id = ua.answer_id
LEFT JOIN users u
ON u.user_id = ua.user_id
left join questions q
on q.id = a.question_id
left join categories c
on c.id = q.cat_id
WHERE a.is_correct = 1
GROUP BY u.user_id
ORDER BY `Score` desc, ua.date desc;
它帶來了好的結果,但我需要分別獲得每個類別的總分。
編輯
select
s.UserName,
s.UserId,
GROUP_CONCAT(Score) AS CategoryScores,
sum(s.TotalScore) as TotalScore,
s.Quizes,
s.LastPlayed
from (select
u.`user_name` AS `UserName`,
u.`user_id` AS `UserId`,
sum(a.is_correct) AS `Score`,
sum(a.is_correct) AS `TotalScore`,
group_concat(distinct c.name) AS `Quizes`,
ua.date as `LastPlayed`,
c.id as CategoryId
FROM users_answers ua
LEFT JOIN answers a
on a.id = ua.answer_id
LEFT JOIN users u
ON u.user_id = ua.user_id
left join questions q
on q.id = a.question_id
left join categories c
on c.id = q.cat_id
WHERE a.is_correct = 1
GROUP BY u.user_id, CategoryId) s
GROUP BY UserId
ORDER BY `TotalScore` desc, LastPlayed desc;
謝謝邁克爾,但是這里的問題是,現在我無法在concat組中獲取類別名稱。
嘗試這個
select
UserName as UserName,
UserId,
group_concat(Score) as Score,
sum(TotalScore) as TotalScore,
LastPlayed,
group_concat(Quizes) QuizNames
from (SELECT
u.`user_name` AS `UserName`,
u.`user_id` AS `UserId`,
count(ua.`id`) AS `Score`,
count(ua.`id`) AS `TotalScore`,
ua.date as `LastPlayed`,
group_concat(distinct c.name) as `Quizes`
FROM users_answers ua
LEFT JOIN answers a
on a.id = ua.answer_id
LEFT JOIN users u
ON u.user_id = ua.user_id
left join questions q
on q.id = a.question_id
left join categories c
on c.id = q.cat_id
WHERE a.is_correct = 1
GROUP BY u.user_id desc,c.id
ORDER BY `Score` desc, ua.date desc,u.user_id) sub
GROUP BY UserId desc
ORDER BY `TotalScore` desc, LastPlayed desc
將c.id
添加到您的SELECT
列表中,然后添加GROUP BY
。 這將導致SUM(a.is_correct)
跨類別ID分組。
SELECT
u.`user_name` AS `UserName`,
u.`user_id` AS `UserId`,
/* CategoryId into the SELECT list */
c.id AS `CategoryId`,
sum(a.is_correct) AS `Score`,
group_concat(distinct c.name) AS `Quizes`
FROM users_answers ua
LEFT JOIN answers a
on a.id = ua.answer_id
LEFT JOIN users u
ON u.user_id = ua.user_id
left join questions q
on q.id = a.question_id
left join categories c
on c.id = q.cat_id
WHERE a.is_correct = 1
/* And add it to the GROUP BY */
GROUP BY
u.user_id,
CategoryId
ORDER BY `Score` desc, ua.date desc, CategoryId;
在注釋中闡明問題之后,將整個內容包裝在子查詢中,然后對總和調用GROUP_CONCAT()
:
SELECT
subq.UserName,
subq.UserId,
GROUP_CONCAT(CONCAT(CategoryName, ': ', Score)) AS CategoryScores,
Quizzes
FROM (
SELECT
u.`user_name` AS `UserName`,
u.`user_id` AS `UserId`,
/* CategoryId into the SELECT list */
c.id AS `CategoryId`,
c.name AS `CategoryName`,
sum(a.is_correct) AS `Score`,
group_concat(distinct c.name) AS `Quizes`
FROM users_answers ua
LEFT JOIN answers a
on a.id = ua.answer_id
LEFT JOIN users u
ON u.user_id = ua.user_id
left join questions q
on q.id = a.question_id
left join categories c
on c.id = q.cat_id
WHERE a.is_correct = 1
/* And add it to the GROUP BY */
GROUP BY
u.user_id,
CategoryId,
CategoryName
) subq
GROUP BY UserId
ORDER BY `Score` desc, ua.date desc;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.