MySQL:根据主表字段值从关联表中获取数据行
嘿,我来帮你搞定这个MySQL关联查询的需求~根据你给出的两张表结构,我们可以通过JOIN操作来关联Service表和request_status表,从而获取对应的数据行。下面分几种常见场景给出解决方案:
解决方案
1. 基础关联查询:获取所有匹配的状态记录
首先,两张表的核心关联字段是service_id和userid(注意request_status表中的字段是Userid,MySQL默认不区分大小写,但建议保持字段名统一避免混淆)。
仅返回两边都有匹配的记录(INNER JOIN)
如果只需要获取那些在request_status表中有对应状态记录的Service数据,可以用INNER JOIN:
SELECT s.service_id, s.userid, s.service_name, s.pending, s.accepted, s.completed, rs.id AS status_id, rs.status, rs.accepted_date FROM Service s INNER JOIN request_status rs ON s.service_id = rs.service_id AND s.userid = rs.Userid;
返回所有Service记录(LEFT JOIN)
如果想保留所有Service表的条目,即使某些Service还没有对应的状态记录(此时状态字段会显示NULL),就用LEFT JOIN:
SELECT s.service_id, s.userid, s.service_name, s.pending, s.accepted, s.completed, rs.id AS status_id, rs.status, rs.accepted_date FROM Service s LEFT JOIN request_status rs ON s.service_id = rs.service_id AND s.userid = rs.Userid;
2. 根据Service的状态过滤结果
如果需要只获取Service表中特定状态的条目对应的状态记录,比如只看pending=1的Service,可以添加WHERE条件:
SELECT s.service_id, s.userid, s.service_name, rs.status, rs.accepted_date FROM Service s INNER JOIN request_status rs ON s.service_id = rs.service_id AND s.userid = rs.Userid WHERE s.pending = 1;
3. 获取每个Service的最新状态记录
如果每个Service在request_status表中有多条状态记录,而你只需要最新的那一条,可以用窗口函数(MySQL 8.0及以上版本支持):
SELECT service_id, userid, service_name, pending, accepted, completed, status_id, status, accepted_date FROM ( SELECT s.service_id, s.userid, s.service_name, s.pending, s.accepted, s.completed, rs.id AS status_id, rs.status, rs.accepted_date, -- 按service_id分组,按时间倒序编号,最新的记录编号为1 ROW_NUMBER() OVER (PARTITION BY s.service_id ORDER BY rs.accepted_date DESC) AS rn FROM Service s LEFT JOIN request_status rs ON s.service_id = rs.service_id AND s.userid = rs.Userid ) t WHERE rn = 1;
内容的提问来源于stack exchange,提问作者ASD
相关产品推荐
相关产品推荐

