问题摘要:我有一个CakePHP / MySQL Web应用程序。用户进行测验以获得徽章。每个测验都有一个级别(1到5)来表示难度(1 =简单,5 =困难)。
我有3张桌子:
测验:一系列测验,每个测验都有难度级别1 - 5(quizzes.test_level)字段和唯一ID(quizzes.id)。
badge_structure :获取特定徽章所需的测验列表。测验的外键'测验'是badge_structure.quiz_id。此表包含每个test_level的多个测验。
结果:特定测验的用户结果列表。外键是results.quiz_id。还有一个results.user_id链接到'用户'表。如果用户已通过测验,则结果仅存储在此表中:如果此表中没有针对给定用户的results.quiz_id,则该用户尚未通过特定测验。
我面临的问题是我无法确定用户已经过了哪个级别。
我的应用程序需要根据给定用户的测验结果显示星级(1 - 5)。他们必须完成特定级别的所有测验(quizzes.test_level)才能获得给定徽章的明星,即
quizzes.test_level = 1(1星)
quizzes.test_level = 2(2星)
对于下面的代码,假设badge_structure.id = 3(徽章编号3)和user.id = 257
SELECT MAX(q.test_level) AS badge_level
FROM badges_structure bs
JOIN quizzes q ON bs.quiz_id = q.id
JOIN results r ON bs.quiz_id = r.quiz_id
WHERE bs.badge_id = 3 AND r.user_id = 257
ORDER BY q.test_level ASC
这将为我提供给定徽章的用户已完成的测验的最大test_level。但是我不知道他们是否已经超过了那个级别,我只知道他们已经完成了那个级别的测验。
如果我运行这样的事情:
SELECT bs.badge_id, bs.quiz_id, q.test_level
FROM badges_structure bs
LEFT JOIN quizzes q ON bs.quiz_id = q.id
LEFT JOIN results r ON bs.quiz_id = r.quiz_id
WHERE bs.badge_id = 3 AND r.user_id = 257
ORDER BY q.test_level ASC
我可以看到他们所做的测验和关卡,但它并没有告诉我该徽章的整个badge_structure,因为它不包括他们还没有得到结果的行。
如何才能看到徽章结构,并且列中的列为“空”'如果用户没有特定测验ID的测验结果?