【问题标题】:Multiple mysql joins, how to combine these 2 select statments多个mysql join,如何组合这2个select语句
【发布时间】: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 条记录的情况下获取字段 data where fieldid=15;应该只有 94 个。
  • @johathan - 你是说只有 94 行 fieldid = 15?那是您减少该表的唯一方法。它应该加入以用户身份说用户吗?在我看来,您可能缺少额外的 where 子句。
  • 这些表是用于moodle数据库(216个表)的,所以我对它们是如何连接的仍然有点困惑。 user_info_data 保存了我添加的字段中的数据。它通过 fieldid 跟踪哪些数据进入哪个字段,该字段连接到另一个包含实际字段(Employer、experience 等)的表,并且由于我只想要来自某个字段的数据,我需要将其限制为 fieldid 15. 所有课程只有 94 名用户注册。
  • 好的,那么您肯定会在这里遗漏一些关键的附加 where 子句。看起来@MvG 正在帮助你完成那部分。

标签: mysql join


【解决方案1】:

我在您的第一个请求中添加了user_info_data,如下所示:

SELECT user.firstname AS Firstname,
       user.lastname AS Lastname,
       user.email AS Email,
       course.fullname AS Course,
       role.name AS Role,
       ibclcCert.data AS 'IBCLC Certified'
FROM user,
     course,
     role,
     role_assignments AS asg,
     context,
     user_info_data AS ibclcCert
WHERE context.contextlevel = 50
  AND role.id=asg.roleid
  AND user.id=asg.userid
  AND context.instanceid=course.id
  AND asg.contextid=context.id
  AND ibclcCert.userid = user.id
  AND ibclcCert.fieldid = '15'

我将user_info_data 表引用重命名为表示实际字段的内容,在本例中为ibclcCert。如果您有一天想要访问多个数据字段,则此重命名是一项规定。当您这样做时,您将多次包含该表,为您需要的每个字段提供一个。有关如何处理此类数据格式的信息,另请参阅 this answer。

【讨论】:

  • 我试了一下,收到了这个错误:#1054 - Unknown column 'user.id' in 'on Clause'
  • 您的数据库中有user.id 列吗?您的第二个查询使用一个,但错误说没有一个。哪个是对的?
  • 是的,有。用户“每个人一条记录”1 id bigint(10) UNSIGNED No None AUTO_INCREMENT 我之前在玩角色时遇到过类似的错误,我切换了使用它们的顺序,它就消失了?
  • 有什么想法吗?我可以从带有别名的 select 语句中进行选择,然后将其与表连接吗?我只需将 user.id 字段添加到第一条语句,然后使用您在上面提供的第二个内部连接。
  • 好的,我尝试了上面评论的内容。我这样做了:SELECT * FROM (SELECT user.id,user.firstname AS Firstname, user.lastname AS Lastname, user.email AS Email, course.fullname AS Course, role.name AS Role FROM user, 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) AS userInfo INNER JOIN user_info_data ON userInfo.id = user_info_data.userid WHERE user_info_data.fieldid = '15'; 并且它有效,只是引入了额外的字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-11
  • 2010-09-27
  • 2018-02-16
相关资源
最近更新 更多