我有两个表名为files_downloads,另一个名为quiz_attempts,共享列= uname
我想获得两个主要结果,(有两个脚本) 1)下载文件并进行测验的用户 2)没有下载(显示NA)文件和DID测验的用户。 这是我尝试的代码:
SELECT f.fname, f.uname, q.qname, q.first, q.second, q.third, q.fourth,q.fifth
FROM files_downloaded f
JOIN quiz_attempts q ON q.uname = f.uname
WHERE f.fname LIKE '%gol14_%'
AND q.qname LIKE '%onlinelernen%'
ORDER BY `f`.`uname` ASC
LIMIT 0 , 30
我花了5个多小时才解决这个问题,但我做不到。我为之疯狂!
fname uname qname first second third fourth fifth
gol14_02_1_einheit.pdf 11mg onlinelernen_quiz_1 100 0 0 0 0
答案 0 :(得分:0)
下载文件并进行测验的用户:
SELECT f.uname FROM files_downloaded f JOIN quiz_attempts q ON(q.uname = f.uname);
没有下载文件并进行测验的用户:
SELECT q.uname FROM files_downloaded f RIGHT JOIN quiz_attempts q ON(q.uname = f.uname) WHERE f.fname IS NULL;
P.S。:未显示" NA",仅选择用户。
答案 1 :(得分:0)
我不认为这将是您的最终查询,但它会回答您的确切问题,但只有一个SQL查询:
我正在尝试获得两个主要结果,(使用两个脚本)1)下载文件并进行测验的用户2)未下载(显示NA)文件和DID测验的用户。
使用CASE语句找出谁下载了文件并进行了测验而不是刚刚进行了测验,还有两个子查询来获取测验计数和每个用户下载的文件数量,使用相同的限制上面的WHERE声明。
SELECT
CASE
WHEN quizcount > 0
AND dlcount > 0
THEN "did both"
WHEN quizcount > 0
AND dlcount = 0
THEN "only did quizzes"
END AS `ActionType`,
q.uname,
q.quizcount,
f.dlcount
FROM (
SELECT uname,
count(*) AS quizcount
FROM quiz_attempts
WHERE qname LIKE '%onlinelernen%'
GROUP BY uname
) AS q
LEFT JOIN (
SELECT uname,
count(*) AS dlcount
FROM files_downloaded
WHERE fname LIKE '%gol14_%'
GROUP BY uname
) AS f
ON q.uname = f.uname
ORDER BY q.uname