MySql数据库 sql查询增加序号的伪列
在查询数据库的时候,我们有时候需要对查询出来的数据加上序列,1,2,3,……n
例如:我们根据表的某个字段排序后,要对这些数据加上序列,这个时候序号常常不是我们建表时设置好的自增的主键id,怎么办呢????
可能我们会用变量来解决,如下
set @rownum=0;
SELECT @rownum:=@rownum+1 AS rownum, table_name.*
FROM table_name
如果在数据库中要用一句SQL语句来实现,这又改怎么办呢????
Oracle数据库有专门的rownum来解决伪序列问题,但是MySQL却到目前为止还没有内置的函数等来解决此问题
这个问题也困扰了我一段时间,到各种上发帖也没有能回答,最后在无意间找到了这种解决方法
SELECT @rownum:=@rownum+1 AS rownum, table_name.*
FROM (SELECT @rownum:=0) r, table_name
把rownum的设置初值放到了from 和需要查询的表的前面
原文来自“老鸟的大心脏”,在这里谢谢他。
希望能帮助更多需要帮助的人……
也希望更多的高手们提出更多的漂亮的方法……
也许有人也会用到存储过程来解决,那也是一个方法,我曾经也用过,但是后来不能用存储过程了,就悲剧了
摘自 ystyaoshengting的专栏
但是程序会报错“Parameter '@rownum' must be defined.”
这时在配置文件数据库链接串后面加上“Allow User Variables=True”,就好了
<!--mysql连接字符串-->
<add key="MySqlConn" value="Server=192.168.1.238;DataBase=gm;Uid=root;Pwd=000000;Allow User Variables=True;"/>
mysql 中文字段排序( 按拼音首字母排序) 的查询语句
在处理使用Mysql时,数据表采用utf8字符集,使用中发现中文不能直接按照拼音排序
如果数据表tbl的某字段name的字符编码是latin1_swedish_ci
select * from `tbl` order by birary(name) asc ;
如果数据表tbl的某字段name的字符编码是utf8_general_ci
SELECT name FROM `tbl` WHERE 1 ORDER BY CONVERT( name USING gbk ) COLLATE gbk_chinese_ci ASC
===================
$orderby="convert(`group` USING gbk) COLLATE gbk_chinese_ci,displayorder,navid"
MYSQL在默认的情况下查询不区分大小写
MYSQL在默认的情况下查询是不区分大小写的,例如:
mysql> create table t1(
-> name varchar(10));
Query OK, 0 rows affected (0.09 sec)
mysql> insert into t1 values('you'),('You'),('YOU');
Query OK, 3 rows affected (0.05 sec)
Records: 3 Duplicates: 0 Warnings: 0
对这个表,缺省情况下,下面两个查询的结果是一样的:
mysql> select * from t1 where name = 'you'; mysql> select * from t1 where name = 'YOU'; |
如果想让MYSQL知道你输入的字母是大写还是小写的,修改表:
mysql> alter table t1 change name name varchar(10) binary;
mysql> select * from t1 where name = 'YOU'; |
如果你只是想在SQL语句中实现的话:
mysql> select * from t1 where name = binary 'YOU';
+------+
| name |
+------+
| YOU |
+------+
1 row in set (0.02 sec)
mysql> select * from t1 where name = binary 'you';
+------+
| name |
+------+
| you |
+------+
1 row in set (0.00 sec)
如果不想这么麻烦而想服务一开启就让大小写一致的话:
可以修改my.ini或者my.cnf
[mysqld]
lower_case_table_names=1
(0:区分;1:不区分)
然后重启MYSQL服务。
mysql> show variables like '%case_table%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 1 |
+------------------------+-------+
1 row in set (0.00 sec)
注:WINDOWS系统不用修改,系统默认就是1
LINUX 系统默认是0。因为LINUX下的脚本都是区分大小写的。