MySQL查询具有相同外键的多个表

MySQL查询具有相同外键的多个表,mysql,sql,inner-join,Mysql,Sql,Inner Join,我需要从多个表中查询相同的表用户,这些表共享引用用户的相同外键 我目前有: SELECT `vendorEmployeeID` AS "Vendor #", CONCAT(`lastName`,", ", `firstName`) AS "Name", `CLINTitle` AS "Position", `iterationName` AS "Exercise", CONCAT(`iterati

我需要从多个表中查询相同的表
用户
,这些表共享引用
用户的相同外键

我目前有:

SELECT `vendorEmployeeID` AS "Vendor #", CONCAT(`lastName`,", ", `firstName`) AS "Name", `CLINTitle` AS "Position", `iterationName` AS "Exercise", CONCAT(`iterationStart`, " - ", `iterationEnd`) AS "Start - End", CONCAT("Team ", `teamNumber`, " - ", `firstName`) AS "Team Number - Manager", `branchName`, `companyName`
FROM users
INNER JOIN `userassignedteam` ON `users`.`userID` = `userassignedteam`.`assignedUserFK`
INNER JOIN `positions` ON `userassignedteam`.`assigendPositionFK` =  `positions`.`positionID`
INNER JOIN `subteamleaders` ON `userassignedteam`.`userAssignedTeamID` = `subteamleaders`.`subTeamLeadersID`
INNER JOIN `iterationinfo` ON `subteamleaders`.`iterationInfoFK` = `iterationinfo`.`iterationInfoID`
INNER JOIN `contractiterations` ON `iterationinfo`.`iterationFK` = `contractiterations`.`contractIterationID`
INNER JOIN `teams` ON `iterationinfo`.`teamFK` = `teams`.`teamID`
INNER JOIN `companybranches` ON `teams`.`branchFK` = `companybranches`.`branchID`
INNER JOIN `company` ON `companybranches`.`companyFK` = `company`.`companyID`

该查询在某种程度上是有效的,但明显的问题是,我需要从表
teams
中输入姓名(firstName,lastName),以显示该团队的经理,他也是表
users
中的用户,同时显示团队成员(因为他们从来都不一样)也来自表
用户
,但记录在一个单独的表中,
userassignedteam

由于需要两个用户,因此需要根据需要添加这些用户

由于Tip对所有表都使用别名,所以读写起来更容易

还有一点,图像总是基本的。foeirgnkey不是真正可见的,更糟糕的是,为了帮助我输入文本,需要花费很多时间

SELECT 
    u.`vendorEmployeeID` AS 'Vendor #',
    CONCAT(u.`lastName`, ', ', u.`firstName`) AS 'Name',
    `CLINTitle` AS 'Position',
    `iterationName` AS 'Exercise',
    CONCAT(`iterationStart`, ' - ', `iterationEnd`) AS 'Start - End',
    CONCAT('Team ',
            `teamNumber`,
            ' - ',
            u1.`firstName`) AS 'Team Number - Manager',
    `branchName`,
    `companyName`
FROM
    users u
        INNER JOIN
    `userassignedteam` ON u.`userID` = `userassignedteam`.`assignedUserFK`
        INNER JOIN
    `positions` ON `userassignedteam`.`assigendPositionFK` = `positions`.`positionID`
        INNER JOIN
    `subteamleaders` ON `userassignedteam`.`userAssignedTeamID` = `subteamleaders`.`subTeamLeadersID`
        INNER JOIN
    `iterationinfo` ON `subteamleaders`.`iterationInfoFK` = `iterationinfo`.`iterationInfoID`
        INNER JOIN
    `contractiterations` ON `iterationinfo`.`iterationFK` = `contractiterations`.`contractIterationID`
        INNER JOIN
    `teams` ON `iterationinfo`.`teamFK` = `teams`.`teamID`
    INNER JOIN users u1
     ON u1.userID = `teams`.`teamMAnagerFK`
        INNER JOIN
    `companybranches` ON `teams`.`branchFK` = `companybranches`.`branchID`
        INNER JOIN
    `company` ON `companybranches`.`companyFK` = `company`.`companyID`

基本上,您需要更多到
users
表的连接。您的图表显示:

SELECT 
    u.vendorEmployeeID AS vendor_number, 
    CONCAT(u.lastName, ', ', u.firstName) AS name, 
    CLINTitle AS position, 
    ci.iterationName AS exercise, 
    CONCAT(ii.iterationStart, ' - ', ii.iterationEnd) AS start_end, 
    CONCAT('Team ', t.teamNumber, ' - ', um.firstName) AS team_number_manager, 
    cb.branchName, 
    c.companyName,
    ut.firstName assigned_user_name
FROM users u
INNER JOIN userassignedteam uat  ON u.userID = uat.assignedUserFK
INNER JOIN positions p           ON uat.assigendPositionFK =  positions.positionID
INNER JOIN subteamleaders stl    ON uat.userAssignedTeamID = stl.subTeamLeadersID
INNER JOIN iterationinfo ii      ON stl.iterationInfoFK = ii.iterationInfoID
INNER JOIN contractiterations ci ON ii.iterationFK = ci.contractIterationID
INNER JOIN teams t               ON ii.teamFK = t.teamID
INNER JOIN companybranches cb    ON t.branchFK = cb.branchID
INNER JOIN company c             ON cb.companyFK = c.companyID
INNER JOIN users um              ON um.userID = t.teamManagerFK
INNER JOIN users ut              ON ut.userID = uat.assignedUserFK
注:

  • 您需要表别名才能多次加入同一个表;我把它们加到你们所有的桌子上;您可以看到为什么这是一个好的实践,因为它缩短了查询并使其更具可读性(因此可维护)

  • 在多表查询中,始终在每个列名前面加上其所属表的(别名);这使得查询对于底层数据结构来说是不言自明的,并且再次提高了可维护性(尽管我无法区分哪个表列
    clinttitle
    ,但您必须自己去弄清楚)


f对于每个用户,您需要创建另一个具有不同别名的users表,但如果不查看您的表,您必须自己完成,重要的部分是不同的别名对不起,我想添加表的图像,但我想我忘了。它已被添加。我已经试过了,但出于某种原因,在某个时候我遇到了一个错误,说某个列名无法识别。我不知道它是什么。我以前试过,这就是我在这里发布的原因,但是您的声明对于venderEmployeeID错误(最初)不明确,所以当我使用alias指定用户来处理该错误时,我得到:
#1054-未知列'users.userID'在'on子句'
中。这就是我在使用别名时遇到的问题。在某些情况下,查询会因为“未知列”而失败,尽管我觉得我已经正确地标识了它。有什么想法吗?表格用户编号称为u,您需要在每个用户使用u表格之前使用它。请参阅更改的答案谢谢,您的解决方案也起到了作用。我希望我也能给你“解决”的答案,但另一位先生的答案是第一个。不过,我对你所有的评论都竖起了大拇指。我真诚地感谢您的洞察力和时间。@RyanSteiger向您提供有用的答案,并接受您喜欢的答案我之所以发布没有别名的帖子,是因为当我使用别名时,我最终会遇到一个错误:
#1054-on子句中的未知列“users.userID”
。虽然我同意您的解决方案应该可以工作,但也产生了此错误。您的解决方案最初明确错误为:
#1064-您的SQL语法有错误;请查看与MySQL服务器版本对应的手册,以了解第3行中使用“CONCAT(u.lastName,,,,u.firstName)作为名称,clintTitle作为位置”的正确语法,这只是前一行末尾缺少的逗号。固定的。