根据表A的某个字段B来排序 然后根据排序结果把表A的字段C设置为这一条记录的排序值
update player as t1 join (select RoleID,(@rowno:=@rowno+1) as rowno from player,(select (@rowno:=0)) b order by RoleID ) as t2 SET t1.rank=t2.rowno WHERE t1.RoleID=t2.RoleID ;
根据player表的RoleID排序然后更新player表的rank字段
另外
select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID where B.ID<3
相当于先执行
select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID ;
让后再把B.ID<3的从查询结果中筛选出来。
select A.ID as AID, B.ID as BID from A left join B on A.ID = B.ID and B.ID<3
先按照on条件刷选表等价于先筛选B表:
select ID from B where ID<3;
然后再与A表关联。
总结
ON后面的筛选条件主要是针对的是关联表【而对于主表刷选条件不适用】。
对于主表的筛选条件应放在where后面,不应该放在ON后面
对于关联表我们要区分对待。如果是要条件查询后才连接应该把查询件放置于ON后。如果是想再连接完毕后才筛选就应把条件放置于where后面
对于关联表我们其实可以先做子查询再做join,但是这样好像会影响效率,比如
select * from bt left join ( select bt1.ID from bt1 where bt1.`VName`<'M5' )B1 on bt.ID = b1.`ID`
where bt.ID <1000 --1
select *
from bt left join bt1 on bt.ID = bt1.`ID` and bt1.`VName`<'M5'
where bt.ID <1000 --2
如果数据量大了,第二种方法会比第一种效率高上百倍
参考: