Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个查询中,从mysql中按用户id分组的多个表中统计不同的总数_Mysql_Sql - Fatal编程技术网

在一个查询中,从mysql中按用户id分组的多个表中统计不同的总数

在一个查询中,从mysql中按用户id分组的多个表中统计不同的总数,mysql,sql,Mysql,Sql,我想从课程和测验表中计算用户id,但我的查询给我带来了错误的数字 SELECT u.id, u.email, u.user, u.joined, MAX(qa.last_attempt_time) as last_attempt_time, COUNT(qa.user_id) total_quiz, COUNT(ct.user_id) total_courses FROM users u LEFT JOIN courses_tak

我想从
课程
测验
表中计算用户id,但我的查询给我带来了错误的数字

SELECT 
    u.id,
    u.email,
    u.user,
    u.joined,
    MAX(qa.last_attempt_time) as last_attempt_time, 
    COUNT(qa.user_id) total_quiz, 
    COUNT(ct.user_id) total_courses 
FROM users u

LEFT JOIN courses_taken ct
ON u.id = ct.user_id

LEFT JOIN quiz_attempt qa
ON u.id = qa.user_id AND qa.attempt_mode=1

GROUP BY u.id
ORDER BY total_courses DESC
表格结构
用户
表格

id、电子邮件、用户、已加入

测验尝试
表格

id、用户id、上次尝试时间、尝试模式等。

课程\u选修
表格

id、用户id、课程id、参加等。



在这里,我试图获得所有用户的测验尝试总数和参加的课程总数。但是我的查询会为测验尝试和课程返回相同的数字。

您可以对一列使用
COUNT DISTINCT
,该列随您尝试计数的值而唯一变化,即:

...
COUNT(DISTINCT qa.id) total_quiz, 
COUNT(DISTINCT ct.course_id) total_courses 
...

您可以对一列使用
COUNT DISTINCT
,该列随您试图计数的值而变化,即:

...
COUNT(DISTINCT qa.id) total_quiz, 
COUNT(DISTINCT ct.course_id) total_courses 
...

由于连接,您可能存在笛卡尔积问题。更好的解决方案是预先聚合结果。但是,在许多情况下,如果表不是太大,则
count(distinct)
可以解决问题:

SELECT u.id, u.email, u.user, u.joined,
       MAX(qa.last_attempt_time) as last_attempt_time, 
       COUNT(DISTINCT qa.id) as total_quiz, 
       COUNT(DISTINCT ct.id) as total_courses 
FROM users u LEFT JOIN
     courses_taken ct
     ON u.id = ct.user_id LEFT JOIN
     quiz_attempt qa
     ON u.id = qa.user_id AND qa.attempt_mode = 1
GROUP BY u.id
ORDER BY total_courses DESC;

请注意,这是因为您使用的是
MAX()
COUNT()
。它不适用于
SUM()
AVG()

由于连接,您可能有笛卡尔积问题。更好的解决方案是预先聚合结果。但是,在许多情况下,如果表不是太大,则
count(distinct)
可以解决问题:

SELECT u.id, u.email, u.user, u.joined,
       MAX(qa.last_attempt_time) as last_attempt_time, 
       COUNT(DISTINCT qa.id) as total_quiz, 
       COUNT(DISTINCT ct.id) as total_courses 
FROM users u LEFT JOIN
     courses_taken ct
     ON u.id = ct.user_id LEFT JOIN
     quiz_attempt qa
     ON u.id = qa.user_id AND qa.attempt_mode = 1
GROUP BY u.id
ORDER BY total_courses DESC;

请注意,这是因为您使用的是
MAX()
COUNT()
。它不适用于
SUM()
AVG()

您不应该在用户ID列上放置distinct,而是将其放置在该表的ID上,如下所示:

SELECT u.id, u.email, u.userid, u.joined,
MAX(qa.last_attempt_time) as last_attempt_time, 
COUNT(DISTINCT qa.id) as total_quiz, 
COUNT(DISTINCT ct.id) as total_courses 
FROM users u LEFT JOIN
courses_taken ct
ON u.id = ct.user_id LEFT JOIN
quiz_attempt qa
ON u.id = qa.user_id AND qa.attempt_mode = 1
GROUP BY u.id, u.email, u.userid, u.joined
ORDER BY total_courses DESC;
或者,如果这让您感到困惑,您可以像这样使用子查询:-

SELECT 
u.id,
u.email,
u.UserId,
u.joined,
qa.last_attempt_time as last_attempt_time, 
qa.total_quizCOUNT,
ct.total_coursesCOUNT 
FROM users u

LEFT JOIN 
(Select user_id, Count(user_id) as total_coursesCOUNT from courses_taken group by user_id) ct
ON u.id = ct.user_id

LEFT JOIN (Select user_id, Count(user_id) total_quizCOUNT, MAX(last_attempt_time) as last_attempt_time from quiz_attempt  where attempt_mode = 1 group by user_id) qa
ON u.id = qa.user_id

ORDER BY total_coursesCOUNT DESC

您不应将distinct放在user_ID列上,而应将其放在该表的ID上,如下所示:

SELECT u.id, u.email, u.userid, u.joined,
MAX(qa.last_attempt_time) as last_attempt_time, 
COUNT(DISTINCT qa.id) as total_quiz, 
COUNT(DISTINCT ct.id) as total_courses 
FROM users u LEFT JOIN
courses_taken ct
ON u.id = ct.user_id LEFT JOIN
quiz_attempt qa
ON u.id = qa.user_id AND qa.attempt_mode = 1
GROUP BY u.id, u.email, u.userid, u.joined
ORDER BY total_courses DESC;
或者,如果这让您感到困惑,您可以像这样使用子查询:-

SELECT 
u.id,
u.email,
u.UserId,
u.joined,
qa.last_attempt_time as last_attempt_time, 
qa.total_quizCOUNT,
ct.total_coursesCOUNT 
FROM users u

LEFT JOIN 
(Select user_id, Count(user_id) as total_coursesCOUNT from courses_taken group by user_id) ct
ON u.id = ct.user_id

LEFT JOIN (Select user_id, Count(user_id) total_quizCOUNT, MAX(last_attempt_time) as last_attempt_time from quiz_attempt  where attempt_mode = 1 group by user_id) qa
ON u.id = qa.user_id

ORDER BY total_coursesCOUNT DESC

我猜
COUNT(DISTINCT user\u id)
将始终返回1,因为OP也在通过
user\u id
加入和分组-将需要对一些变化的内容进行DISTINCT计数。此查询每time@FaizAli . . . 我修好了。计数需要在表中的id上,而不是在用于连接它们的键上。我猜
COUNT(DISTINCT user\u id)
将始终返回1,因为OP也在连接,而按
user\u id进行分组将需要在一些变化的内容上进行DISTINCT计数。此查询每time@FaizAli . . . 我修好了。计数需要在表中的ID上,而不是在用于连接它们的键上。