问题描述:Mysql执行得到两条数据,可是返回客户端只有一条
问题背景:有三张mysql数据表,分别是房间表room,玩家表player,客户资料表customer_user,玩家表的字段roomId对应房间表,userId对应客户资料表,每个房间有多个玩家,每个玩家分别对应了客户资料表,mybatis怎么写sql,查询房间的时候,把房间的玩家以及玩家信息查询出来,我需要深层嵌套,将客户资料表作为玩家的属性
有问题代码:
<resultMap type="Room" id="RoomResult">
<id property="roomId" column="room_id" />
<result property="roomTitle" column="room_title" />
<result property="roomOwnerId" column="room_owner_id" />
<result property="roomTags" column="room_tags" />
<result property="scoreMode" column="score_mode" />
<result property="qrCode" column="qr_code" />
<result property="appId" column="app_id" />
<result property="isPlaten" column="is_platen" />
<result property="userId" column="user_id" />
<result property="shopId" column="shop_id" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="remark" column="remark" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<!-- 嵌套玩家列表 -->
<collection property="player" ofType="Player" resultMap="playerResult" />
</resultMap>
<resultMap id="playerResult" type="Player">
<result property="playerScore" column="player_score" />
<result property="isOnlooker" column="is_onlooker" />
<result property="userId" column="user_id" />
<!-- 嵌套客户资料 -->
<association property="customerUser" resultMap="customerUserResult" />
</resultMap>
<resultMap id="customerUserResult" type="CustomerUser">
<result property="nickName" column="nick_name" />
<result property="avatar" column="avatar" />
</resultMap>
<sql id="selectRoomVo">
select d.room_id, d.room_title, d.room_owner_id, d.score_mode, d.room_tags, d.qr_code,
d.app_id, d.is_platen, d.del_flag, d.user_id, d.shop_id,
p.player_score, p.is_onlooker, p.user_id,
c.nick_name, c.avatar,
d.remark, d.status, d.create_by, d.update_by, d.create_time, d.update_time
from tb_room d
left join tb_player p on d.room_id = p.room_id
left join tb_customer_user c on p.user_id = c.user_id
</sql>
<select id="selectRoomById" parameterType="Long" resultMap="RoomResult">
<include refid="selectRoomVo"/>
where d.room_id = #{roomId}
</select>
问题出在
这三张表,都直接使用了user_id,没有区分取值,造成了重复
正确应该
<resultMap type="Room" id="RoomResult">
<id property="roomId" column="room_id" />
<result property="roomTitle" column="room_title" />
<result property="roomOwnerId" column="room_owner_id" />
<result property="roomTags" column="room_tags" />
<result property="scoreMode" column="score_mode" />
<result property="qrCode" column="qr_code" />
<result property="appId" column="app_id" />
<result property="isPlaten" column="is_platen" />
<result property="userId" column="user_id" />
<result property="shopId" column="shop_id" />
<result property="status" column="status" />
<result property="delFlag" column="del_flag" />
<result property="remark" column="remark" />
<result property="createBy" column="create_by" />
<result property="createTime" column="create_time" />
<result property="updateBy" column="update_by" />
<result property="updateTime" column="update_time" />
<!-- 嵌套玩家列表 -->
<collection property="player" ofType="Player" resultMap="playerResult" />
</resultMap>
<resultMap id="playerResult" type="Player">
<result property="playerScore" column="player_score" />
<result property="isOnlooker" column="is_onlooker" />
<result property="userId" column="player_id" />
<!-- 嵌套客户资料 -->
<association property="customerUser" resultMap="customerUserResult" />
</resultMap>
<resultMap id="customerUserResult" type="CustomerUser">
<result property="nickName" column="nick_name" />
<result property="avatar" column="avatar" />
</resultMap>
<sql id="selectRoomVo">
select d.room_id, d.room_title, d.room_owner_id, d.score_mode, d.room_tags, d.qr_code,
d.app_id, d.is_platen, d.del_flag, d.user_id, d.shop_id,
p.player_score, p.is_onlooker, p.user_id as player_id,
c.nick_name, c.avatar,
d.remark, d.status, d.create_by, d.update_by, d.create_time, d.update_time
from tb_room d
left join tb_player p on d.room_id = p.room_id
left join tb_customer_user c on p.user_id = c.user_id
</sql>
<select id="selectRoomList" parameterType="Room" resultMap="RoomResult">
<include refid="selectRoomVo"/>
where del_flag = '0'
<if test="roomId != null and roomId != ''">
AND d.room_id = #{roomId}
</if>
<if test="userId != null and userId != ''">
AND d.user_id = #{userId}
</if>
<if test="shopId != null and shopId != ''">
AND d.shop_id = #{shopId}
</if>
<if test="appId != null and appId != ''">
AND d.app_id = #{appId}
</if>
<if test="isPlaten != null and isPlaten != ''">
AND d.is_platen = #{isPlaten}
</if>
<if test="delFlag != null and delFlag != ''">
AND d.del_flag = #{delFlag}
</if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
AND date_format(d.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
</if>
<if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
AND date_format(d.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
</if>
</select>
<select id="selectRoomById" parameterType="Long" resultMap="RoomResult">
<include refid="selectRoomVo"/>
where d.room_id = #{roomId}
</select>
最核心的是,怎么发现问题,排查问题
1、执行sql语句
2、打断点调试
3、写死数据,执行看看