mysql 一对多反查

444 阅读1分钟

A表1对1关联C表,表1对1关联C表 C表根据字段type、fId关联A\B表 查询C表及关联的A\B表信息

<select id="queryByPage" resultType="com.mdsapp.ecs.module.manage.entity.FlowCardEntity">
    SELECT fc.*, temp.deviceName, temp.deviceNo
    FROM flow_card fc
    LEFT JOIN (
        SELECT fc.id, d.name AS deviceName, d.sip_username AS deviceNo FROM flow_card fc INNER JOIN device d ON d.id = fc.device_id AND fc.device_type = 0
        UNION
        SELECT fc.id, b.name AS deviceName, b.`code` AS deviceNo FROM flow_card fc INNER JOIN beacon b ON b.id = fc.device_id AND fc.device_type = 1
        UNION
        SELECT fc.id, t.name AS deviceName, t.mac AS deviceNo FROM flow_card fc INNER JOIN terminal t ON t.id = fc.device_id AND fc.device_type = 2
        UNION
        SELECT fc.id, wd.name AS deviceName, wd.device_no AS deviceNo FROM flow_card fc INNER JOIN wait_device wd ON wd.id = fc.device_id AND fc.device_type = 3
    ) temp ON temp.id = fc.id
    <where>
        <if test="companyId != null and companyId !=''">
            AND fc.company_id = #{companyId}
        </if>
        <if test="deviceType != null and deviceType !=''">
            AND fc.device_type = #{deviceType}
        </if>
        <if test="status != null and status !=''">
            AND fc.status = #{status}
        </if>
        <if test="keyword != null and keyword !=''">
            AND (temp.deviceName like CONCAT( #{keyword}, '%') or
            fc.phone like CONCAT('%', #{keyword}, '%') or
            fc.imsi like CONCAT('%', #{keyword}, '%')
            )
        </if>
    </where>
    ORDER BY fc.id
</select>

<select id="queryById" resultType="com.mdsapp.ecs.module.manage.entity.FlowCardEntity">
    SELECT fc.*,
       CASE device_type
           WHEN 0 THEN
                (SELECT name FROM device WHERE fc.device_id = id)
           WHEN 1 THEN
                (SELECT name FROM beacon WHERE fc.device_id = id)
           WHEN 2 THEN
                (SELECT name FROM terminal WHERE fc.device_id = id)
           WHEN 3 THEN
                (SELECT name FROM wait_device WHERE fc.device_id = id)
           END AS deviceName,
       CASE device_type
           WHEN 0 THEN
                (SELECT sip_username FROM device WHERE fc.device_id = id)
           WHEN 1 THEN
                (SELECT `code` FROM beacon WHERE fc.device_id = id)
           WHEN 2 THEN
                (SELECT mac FROM terminal WHERE fc.device_id = id)
           WHEN 3 THEN
                (SELECT device_no FROM wait_device WHERE fc.device_id = id)
           END AS deviceNo

    FROM flow_card fc where fc.id = #{id};

</select>