不要极至最求一条sql语句搞定一切,可合理拆分为多条语句sql
Sql 语句中,直接在SELECT
使用@
定义一个变量,如:[@a](https://my.oschina.net/a8856225a)
。express
使用:=
来给变量赋值,:[@a](https://my.oschina.net/a8856225a):=123
,则变量a的值为123。函数
SELECT @a := id FROM table_a
SELECT @a := 1 FROM table_a
同时定义多个变量,须要在子语句中定义spa
SELECT @a := 1 FROM table_a,(SELECT @b := 2,@c := 3) as rcrcia
例子.net
根据子查询结果,将主查询结果进行排序code
# 使用 find_in_set 查询ID排序位置 select id, find_in_set(id, @rank) `rank` from user, # 声明定义变量 赋值为 子查询结果 结果为 '3,1,31' (SELECT @rank := (SELECT group_concat(content_id) as content_id FROM `collect_records` WHERE user_id = 1 order by creation_time desc)) as indexRank # 查询符合子查询结果的数据 where find_in_set(id, @rank) > 0 # 根据排序值排序 order by `rank`;
if(A,B,C)
表示,若是A
条件成立,那么执行B,不然执行C排序
@abc := if(2>1,100,200) > @abc = 100
CASE 后面不带表达式ci
CASE WHEN expression THEN 操做1 WHEN expression THEN 操做2 ....... ELSE 操做n END
CASE 后面带表达式,此时WHEN 后面的则是该表达式可能的值字符串
CASE expression WHEN 值1 THEN 操做1 WHEN 值2 THEN 操做2 ....... ELSE 操做n END
注:自上而下,凡是走了其中一个when或者是走了else了,其余的都再也不走了。get
请注意,该函数有拼接字符串最大长度限制。而且,与 limit
不能共存。