MySQL 查询多个表 w/Same 外键

MySQL Query Multiple Tables w/Same Foreign Keys

我需要从多个 table 查询相同的 table users,它们共享引用 users 的相同外键。

我目前有这个:

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`

查询在一定程度上有效,但明显的问题是我需要 table teams 中的姓名 (firstName, lastName) 来显示该团队的经理,他也是table users 中的用户,同时显示同样来自 table users 但被记录的团队成员(因为他们永远不会相同)在单独的 table、userassignedteam.

由于您需要两个用户,因此您需要根据需要添加用户。

由于 Tip 对所有表使用别名,因此更易于读写。

另外一点,图片总是很糟糕。foeirgnkey 并不真正可见,而且 os 更糟糕的是,为了帮助我需要打字,我需要很多时间os =11=]

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 table。您的图表表明:

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

备注:

  • 您需要 table 别名才能多次加入同一个 table;我将它们添加到您 table 的 all;您会明白为什么这是一个很好的做法,因为它缩短了查询并使其更具可读性(因此可维护)

  • 在 multi-table 查询中,始终在每个列名称前加上它所属的 table 的(别名);这使得关于底层数据结构的查询 self-explanatory - 并且再次提高了可维护性(我不知道 table 列 CLINTitle 来自哪个,你必须弄清楚自己解决)