1. 今天在做left join关联查询时候,有如下sql, 我想拉出app列表,并且要显示出当前用户在每个app里面声望值,后来发现查询为空,很疑惑即使右表没有符合条件的数据,left join是会把左表的数据全部返回的啊,为什么为空呢,找了半天原因就在kmta.account_address = #{accountAddress}这里,这个sql在kaa.effective=1之上部分执行是会有结果的,where里面的条件是对整个left join结果之后做了条件限制,#{accountAddress}在kmta里面不存在,那么在left join之后的结果也是不存在,加上条件必然为空了。
SELECT
kaa.app_icon appIcon,
kaa.app_name appName,
cast(score / 10 AS DECIMAL(2, 1)) myScore,
kaa.app_describe appDescribe,
kaa.download,
kaa.appPackageName,
kaa.iosPackageName,
kaa.app_intro appIntro,
kaa.app_img appImg
FROM
kyc_app_auth kaa
LEFT JOIN kyc_mock_transaction_app kmta ON kaa.id = kmta.app_id
WHERE
kaa.effective = 1
AND kmta.account_address = #{accountAddress}
做了如下修改,把accountAddress的限制放在内部:
SELECT
kaa.app_icon appIcon,
kaa.app_name appName,
cast(score / 10 AS DECIMAL(2, 1)) myScore,
kaa.app_describe appDescribe,
kaa.download,
kaa.appPackageName,
kaa.iosPackageName,
kaa.app_intro appIntro,
kaa.app_img appImg
FROM
kyc_app_auth kaa
LEFT JOIN (
SELECT
*
FROM
kyc_mock_transaction_app kmta
WHERE
kmta.account_address = #{accountAddress})
km ON kaa.id = km.app_id
WHERE
kaa.effective = 1
2. 将同一个表中一个字段值更新至另个一字段, 比如用户账户表,vip用户余额是amount字段(balance字段是null),普通用户是balance字段(amount字段是null),现在要都统一成balance字段。
update account set balance = amount where balance is null
乍一看好像没问题,但是where后面并没有条件,限制是同一条数据的amount赋给balance,意味着要同一id的数据才能update。
所以在这里要引入内连接
update account a inner join b
on a.id = b.id
set a.balance = b.amount
where a.balance is null