【发布时间】:2012-07-18 14:30:45
【问题描述】:
我有 2 个选择语句,我想合并为一个,但我真的只需要第二个选择语句中一个字段的信息(来自 user_info_data 的字段 data)。我需要的字段是名字、姓氏、电子邮件、课程全名、角色和字段data where fieldid = '15'。第一个 select 语句将给我除数据字段之外的所有内容。第二个给了我除了课程之外的一切。我尝试执行类似于 Role 字段的第二个 select 语句,但它抱怨它返回不止一行。如果我尝试只使用不带 fieldid='15' 部分的课程名称,它会带来超过 100k 条记录(每个用户都显示在每门课程及其所有数据中)。
表格字段:
user(id,auth,confirmed,policyagreed,username,password,idnumber,firstname,lastname,email,phone etc..)
user_info_data(id,userid,fieldid,data)
role(id,name,shortname,description,sortorder)
role_assignments(id,roleid,contextid,userid...)
context(id,contextlevel,instanceid,path,depth)
第一句话:
SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, course.fullname AS Course, role.name AS Role
FROM user AS user, course AS course,role,role_assignments AS asg
INNER JOIN context AS context ON asg.contextid=context.id
WHERE context.contextlevel = 50
AND role.id=asg.roleid
AND user.id=asg.userid
AND context.instanceid=course.id
第一个语句的输出:
名字姓氏电子邮件课程角色
John Doe john.doe@email.com 课程名称学生
第二句话:
SELECT user.firstname AS 'First Name', user.lastname AS 'Last Name', user.email AS 'Email', user_info_data.data AS 'IBCLC Certified'
FROM user, user_info_data
WHERE user.id = user_info_data.userid
AND fieldid = '15'
第二条语句的输出:
名字 姓氏 电子邮件 IBCLC 认证
John Doe john.doe@email.com 是的
期望的输出:
名字、姓氏、电子邮件、IBCLC 认证、课程、角色
我尝试的其他选择语句:调出 9,494 条记录,但现在 fieldid 为 15 的字段数据是可能选择的列表,这可能是为什么?
SELECT user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, userdata.data, course.fullname AS Course, role.name AS Role
FROM user AS user, course AS course, user_info_data AS userdata, role,role_assignments AS asg
INNER JOIN context AS context ON asg.contextid=context.id
WHERE context.contextlevel = 50
AND userdata.fieldid = 15
AND role.id=asg.roleid
AND user.id=asg.userid
AND context.instanceid=course.id
【问题讨论】:
-
在您尝试过的选择语句中,为什么不直接在 FROM 子句中添加“角色”而不是使用嵌入式选择语句?
-
@northpole 这行得通,并带来与第一条语句相同的结果,但我仍然不知道如何在没有 113974 条记录的情况下获取字段
datawhere fieldid=15;应该只有 94 个。 -
@johathan - 你是说只有 94 行 fieldid = 15?那是您减少该表的唯一方法。它应该加入以用户身份说用户吗?在我看来,您可能缺少额外的 where 子句。
-
这些表是用于moodle数据库(216个表)的,所以我对它们是如何连接的仍然有点困惑。 user_info_data 保存了我添加的字段中的数据。它通过 fieldid 跟踪哪些数据进入哪个字段,该字段连接到另一个包含实际字段(Employer、experience 等)的表,并且由于我只想要来自某个字段的数据,我需要将其限制为 fieldid 15. 所有课程只有 94 名用户注册。
-
好的,那么您肯定会在这里遗漏一些关键的附加 where 子句。看起来@MvG 正在帮助你完成那部分。