mysql: 查询3个表中的多条记录?
mysql: query multiple records in 3 tables?
程序员们大家好。我有 3 个表,具有以下示例记录。
tbl_members 有:
mem_id | mem_fname | mem_lname
1 | Ryan | Layos
2 | Dhave | Sebastian
3 | Staven | Siegal
4 | Ma Ethel | Yocop
5 | Kelvin | Salvador
6 | Herbert | Ares
tbl_member_status 有:
status_id | mem_id | leader_id | process_id
1 | 2 | 1 | 2
2 | 3 | 5 | 3
3 | 4 | 6 | 4
4 | 5 | 1 | 4
5 | 1 | 6 | 4
(tbl_member_status.mem_id 是 tbl_members.mem_id 的外键,leader_id 也是 tbl_members.mem_id 的外键,因为在我的例子中,成员可以是领导者。1 个成员1 位领导者)
tbl_process 有:
process_id | process_type
1 | CONSOLIDATION
2 | PRE-ENCOUNTER
3 | ENCOUNTER
4 | POST-ENCOUNTER
(一个成员有一个过程,我使用枚举值:CONSOLIDATION、PRE-ENCOUNTER、ENCOUNTER、POST-ENCOUNTER 等)
我现在的问题是正确的 sql 查询来获取所需的输出查询。
tbl_query_result
mem_id | member_fname | member_lname | leader_fname | leader_lname | process_type
2 | dhave | sebastian | Ryan | Layos | PRE-ENCOUNTER
5 | Kelvin | Salvador | Ryan | Layos | POST-ENCOUNTER
请记住,tbl_member_status 的两列指的是 tbl_members 的一列,即 mem_id。
更新:
到目前为止我做了什么:
SELECT member.mem_fname, member.mem_lname, leader.mem_fname, leader.mem_lname, tbl_process.process_type
FROM
tbl_member_status as mem_stats
INNER JOIN
tbl_members as member
INNER JOIN
tbl_members as leader
INNER JOIN
tbl_members ON mem_stats.member_id = member.mem_id
INNER JOIN
tbl_process ON tbl_process.process_id = mem_stats.process_id
WHERE
leader.mem_fname = 'Ryan'
此查询获取所有记录,即使 leader.mem_fname 不等于 'Ryan'
因为你查询的时候。结果中的行数很重要。例如:如果您的结果是 fname = ryan,但是 table 中 mem.id 的匹配 memberstatus 是二,然后在过程中 table 又是二。简而言之,您将在最终输出中有 2 行。
你能试试这个吗:
Select M.member_fname, M.mem_lname P.process_type from tbl_members M, tbl_member_status MS, tbl_process P where M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan'
好吧,我一开始误解了你的问题。我有一个解决方案可以改善您的数据库模式。如果一个成员只有一个领导者,而一个领导者有很多成员。那么为什么不创建一个名为 leader 的不同 table 并直接连接到成员 table?所以这将是一对一的关系。这将使查询变得更加简单。所以现在你有 4 tables。
Select M.member_fname, M.mem_lname, L.fname, L.lname, P.process_type
from tbl_members M, tbl_member_status MS, tbl_process P, tbl_leader L
where M.leader_id = L.id and M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan'
程序员们大家好。我有 3 个表,具有以下示例记录。
tbl_members 有:
mem_id | mem_fname | mem_lname
1 | Ryan | Layos
2 | Dhave | Sebastian
3 | Staven | Siegal
4 | Ma Ethel | Yocop
5 | Kelvin | Salvador
6 | Herbert | Ares
tbl_member_status 有:
status_id | mem_id | leader_id | process_id
1 | 2 | 1 | 2
2 | 3 | 5 | 3
3 | 4 | 6 | 4
4 | 5 | 1 | 4
5 | 1 | 6 | 4
(tbl_member_status.mem_id 是 tbl_members.mem_id 的外键,leader_id 也是 tbl_members.mem_id 的外键,因为在我的例子中,成员可以是领导者。1 个成员1 位领导者)
tbl_process 有:
process_id | process_type
1 | CONSOLIDATION
2 | PRE-ENCOUNTER
3 | ENCOUNTER
4 | POST-ENCOUNTER
(一个成员有一个过程,我使用枚举值:CONSOLIDATION、PRE-ENCOUNTER、ENCOUNTER、POST-ENCOUNTER 等)
我现在的问题是正确的 sql 查询来获取所需的输出查询。
tbl_query_result
mem_id | member_fname | member_lname | leader_fname | leader_lname | process_type
2 | dhave | sebastian | Ryan | Layos | PRE-ENCOUNTER
5 | Kelvin | Salvador | Ryan | Layos | POST-ENCOUNTER
请记住,tbl_member_status 的两列指的是 tbl_members 的一列,即 mem_id。
更新:
到目前为止我做了什么:
SELECT member.mem_fname, member.mem_lname, leader.mem_fname, leader.mem_lname, tbl_process.process_type
FROM
tbl_member_status as mem_stats
INNER JOIN
tbl_members as member
INNER JOIN
tbl_members as leader
INNER JOIN
tbl_members ON mem_stats.member_id = member.mem_id
INNER JOIN
tbl_process ON tbl_process.process_id = mem_stats.process_id
WHERE
leader.mem_fname = 'Ryan'
此查询获取所有记录,即使 leader.mem_fname 不等于 'Ryan'
因为你查询的时候。结果中的行数很重要。例如:如果您的结果是 fname = ryan,但是 table 中 mem.id 的匹配 memberstatus 是二,然后在过程中 table 又是二。简而言之,您将在最终输出中有 2 行。 你能试试这个吗:
Select M.member_fname, M.mem_lname P.process_type from tbl_members M, tbl_member_status MS, tbl_process P where M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan'
好吧,我一开始误解了你的问题。我有一个解决方案可以改善您的数据库模式。如果一个成员只有一个领导者,而一个领导者有很多成员。那么为什么不创建一个名为 leader 的不同 table 并直接连接到成员 table?所以这将是一对一的关系。这将使查询变得更加简单。所以现在你有 4 tables。
Select M.member_fname, M.mem_lname, L.fname, L.lname, P.process_type
from tbl_members M, tbl_member_status MS, tbl_process P, tbl_leader L
where M.leader_id = L.id and M.mem_id = MS.mem_id and MS.process_id = P.process_id and where M.member_fname = 'ryan'