我是SQL的新手,如果这是一个愚蠢的问题,我深表歉意。
我正在尝试在Wordpress中构建一个非常基本的LMS,并且对我的SQL逻辑有所了解。
现在,每当我向测验表中添加新测验时,我都希望有一个用户表(包含每个用户数据)和一个测验表(包含每个测验的内容),我想在用户表中添加一列其中将包含一个布尔字段,用于跟踪用户是否已完成新测验。
我不确定这是否是正确的方法,还是应该使用联接表将它们组合在一起?任何关于我应该去这里的方向的建议将不胜感激!
答案 0 :(得分:2)
这不是实现SQL
功能的正确方法。
相反,您将要创建第三个表,以建立用户与其完成的测验之间的关系。它看起来像这样。
CREATE TABLE users_completed_quizzes (
-- completion_id INT IDENTITY
, user_id INT
, quiz_id INT
, score FLOAT
, notes NVARCHAR(255)
-- , PRIMARY KEY (user_id , quiz_id) -- PK One
-- , PRIMARY KEY (relationship_id) -- PK Two
, FOREIGN KEY (quiz_id) REFERENCES Quizzes(id)
, FOREIGN KEY (user_id) REFERENCES Users(id)
)
对于用户完成的每个测验,您将在该表中insert
记录一条记录,其中包含用户的user_id
和测验的quiz_id
。我还添加了其他一些字段,以便您可以跟踪其他数据,例如它们的分数或有关测验如何进行的任何相关注释。
您将看到一些行显示为灰色。这些与表的主键有关。这是field
,将唯一地标识表上的记录。
确定要使用的主键。
第一个是外键的组合。这是相当标准的,很容易考虑,但更难使用。使用此方法多次实施相同测验的相同用户也将变得更加困难。
第二个是唯一的标识列。这是一个自动递增的编号,将跟踪新记录的每次插入。它更易于使用,但对于新用户而言,从逻辑上可能难以遵循。使用此方法更容易实现测验历史记录。
如果选择使用第二个主键,则必须取消注释第一行才能将该字段添加到表中。
如果选择使用第一个主键,则需要删除user_id
之前的逗号以保持正确的语法。
请勿同时使用两个主键(PK)。如果您尝试这样做,SQL将会生您的气。
评论由--
表示。
一些关于主键One的查询示例。
-- returns all the quizzes a single user has completed.
SELECT quiz_id FROM users_completed_quizzes WHERE user_id = '1'
-- returns all quizzes that have not been completed by a any user.
SELECT id FROM Quizzes
LEFT OUTER JOIN users_completed_quizzes
ON Quizzes.id = users_completed_quizzes.quiz_id
WHERE quiz_id = NULL;
-- returns all quizzes that have been completed by at least one user.
SELECT id FROM Quizzes
WHERE id EXISTS (SELECT quiz_id FROM users_completed_quizzes)
-- returns user and quiz info using the association table.
SELECT quiz_id, user_id , Users.region , Quizzes.category
FROM users_completed_quizzes
INNER JOIN Users ON
Users.id = users_completed_quizzes.user_id
INNER JOIN Quizzes ON
Quizzes.id = users_completed_quizzes.quiz_id
用户完成测验后,您将需要执行如下所示的sql
语句。
INSERT INTO users_completed_quizzes (user_id , quiz_id) -- you can add more fields here if you wish.
VALUES ( {User's Id from Users.id} , {Quiz's Id from Quizzes.id} )