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
来自哪个,你必须弄清楚自己解决)
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
来自哪个,你必须弄清楚自己解决)