MySQL中符號@的作用
select @a;
變量名,如果你不加的話,會認為這是一個列名,但是這列不存在,就報錯了;
- @變量名 : 定義一個用戶變量.
- = 對該用戶變量進行賦值.
用戶變量賦值有兩種方式: 一種是直接用"=“號,另一種是用”:=“號。
其區(qū)別在于:
- 使用set命令對用戶變量進行賦值時,兩種方式都可以使用;
- 用select語句時,只能用”:=“方式,因為select語句中,”="號被看作是比較操作符。
(@i:=@i+1)
可以在生成查詢結果表的時候生成一組遞增的序列號
select (@i:=@i+5) as rownum, surname, personal_name from student, (select @i:=100) as init;
select @ids := 101,@l := 0
GROUP_CONCAT + group by
按照分組,連接字段上的數據,默認以,,也可以指定分割符
mysql的@用法
1,增加臨時表,實現變量的自增
SELECT (@i:=@i+1),t.* FROM table_name t,(SELECT @i:=0) AS j
(@i:=@i+1)代表定義一個變量,每次疊加1;
(SELECT @i:=0) AS j 代表建立一個臨時表,j是隨便取的表名,但別名一定要的。
2,實現排序遞增
SELECT ( @i := @i + 1 ), p.* FROM ( SELECT * FROM sys_region ORDER BY create_time DESC ) p, ( SELECT @i := 0 ) k

3,實現分組遞增
SELECT @r := CASE WHEN @type = a.LEVEL THEN @r + 1 ELSE 1 END AS rowNum, @type := a.`level` AS type, a.id FROM sys_region a,( SELECT @r := 0, @type := '' ) b;

這里用了臨時變量@type,因為對臨時變量操作的時候,被使用的變量都是臨時變量。
實戰(zhàn)
INSERT INTO t_top ( col_account, col_date, p_account, p_name ) SELECT b.col_account, b.col_date, b.p_account, b.p_name FROM ( SELECT @num := CASE WHEN @account = a.col_account THEN @num + 1 ELSE 1 END AS rownum, @account := a.col_account AS account, a.* FROM ( SELECT * FROM zb_top ORDER BY col_account, p_avg DESC ) a, ( SELECT @num := 0, @account := '' ) j ) b where 6 > b.rownum
計算用戶距上次訪問的天數,根據imei號區(qū)分不同的用戶,如果時間段內只有一次訪問則為0。
初始化數據:
代碼示例:
CREATE TABLE `pd` (
`imei` varchar(32) NOT NULL DEFAULT '',
`date` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `pd` VALUES ('1', '2013-07-25 00:00:01');
INSERT INTO `pd` VALUES ('1', '2013-07-26 00:00:02');
INSERT INTO `pd` VALUES ('2', '2013-07-23 00:00:04');
INSERT INTO `pd` VALUES ('2', '2013-07-26 00:00:03');
INSERT INTO `pd` VALUES ('3', '2013-07-26 00:00:01');
腳本,使用@特殊變量:
代碼示例:
SELECT * FROM ( SELECT imei user_id, max(max_dd), max(max_dd_2), to_days(max(max_dd)) - to_days(max(max_dd_2)) days FROM ( SELECT imei, max_dd, max_dd_2 FROM ( SELECT tmp.imei, tmp.date, IF(@imei = tmp.imei, @rank := @rank + 1, @rank := 1) AS ranks, IF(@rank = 1, @max_d := tmp.date, @max_d := NULL) AS max_dd, IF(@rank = 2, @max_d_2 := tmp.date, @max_d_2 := NULL) AS max_dd_2, @imei := tmp.imei FROM (SELECT imei, date FROM pd ORDER BY imei ASC, date DESC) tmp, (SELECT @rownum := 0, @imei := NULL, @rank := 0, @max_d := NULL, @max_d_2 := NULL) a ) result ) t GROUP BY imei HAVING count(*) > 1 ) x WHERE x.days >= 1 AND EXISTS (SELECT 'x' FROM pd WHERE date > '2013-07-26 00:00:00')

注意:
表數據量較大時,使用union all等操作將會有悲劇性的結果。
到此這篇關于MySQL中符號@的作用的文章就介紹到這了,更多相關MySQL 符號@內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳解 Mysql查詢結果順序按 in() 中ID 的順序排列
這篇文章主要介紹了詳解 Mysql查詢結果順序按 in() 中ID 的順序排列的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

