在SQL中

时间:2018-08-20 18:15:06

标签: sql wordpress

我是SQL的新手,如果这是一个愚蠢的问题,我深表歉意。

我正在尝试在Wordpress中构建一个非常基本的LMS,并且对我的SQL逻辑有所了解。

现在,每当我向测验表中添加新测验时,我都希望有一个用户表(包含每个用户数据)和一个测验表(包含每个测验的内容),我想在用户表中添加一列其中将包含一个布尔字段,用于跟踪用户是否已完成新测验。

我不确定这是否是正确的方法,还是应该使用联接表将它们组合在一起?任何关于我应该去这里的方向的建议将不胜感激!

1 个答案:

答案 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} )