Mysql深层嵌套执行得到两条数据,可是返回客户端只有一条

问题描述: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') &gt;= 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') &lt;= 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、写死数据,执行看看 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值