mysql中union和union all的区别和注意点
昨天有个功能要实现排行效果,而且是随机按照某些字段的总值,但是第一个又要不一样,因为第一个人给了钱,所以要排第一。
打个比方吧,表(userinfo)中有这几个字段:username,isvalid,givedmoney,sumip,dayip,monthip,visitcount,regdate
现在要实现显示排行前10位用户,
出现在排行第一位的要是givedmoney为1的用户(表示给了钱), 而且isvalid为1(表示通过认证)
其它的9个用户呢,要在字段(sumip,dayip,monthip,visitcount)中随机选择一个作为排序的依据
这样的sql语句改怎么写呢?
下面是我的答案:
$arr_orderby=array("sumip","dayip","monthip","visitcount");
$orderby_filed=$arr_orderby(array_rand($arr_orderby) ); //得到随机字段
$sql="(select username,".$orderby_filed." from userinfo where isvalid=1 and givedmoney=1 limit 1) union (select username,".$orderby_filed." from userinfo where isvalid=1 and givedmoney!=1 limit 9) order by rand(),".$orderby_filed." desc";
?>
这里需要注意的几点是,
1:union前后的select字段一定要一样,而且顺序要一样,如果你不是select * 的话
2:第二个select中,试试limit 9和limit 10有什么不一样的效果
union和union all的区别就是后面能踢出重复的结果,如果确定表中没有重复的字段,建议使用union all
一 UNION语法
代码 复制代码
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
SELECT ...
UNION [ALL | DISTINCT]
SELECT ...
[UNION [ALL | DISTINCT]
SELECT ...]
UNION用于把来自许多
相关文档:
给mysql开一个可以远程访问的用户命令如下:
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' IDENTIFIED BY 'mypassword' WITH GRANT OPTION;
"*.*" 表示数据库中所有的表,也可以换成指定的表如test.*
"myuser" 表示的是访问的用户名;
"%" 表示所有的主机即任何的主机都可以通过这个用户名访问我的数据库,也可以该成特定� ......
在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在; 2. 如果不存在,则插入;3.如果存在,则更新。
在 SQL Server 中可以这样处理:
if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time = getdate() where id = ......
1. 给root加密码:/usr/bin/mysqladmin -u root password 123456
2. 导出:mysqldump -u root -p dbname > file.sql
3. 导入:mysql -u root -p dbname < backup-file.sql
4. 授权:grant all on *.* to root@"%" identified by "密码";
5. 收回权限:revoke all privileges on *.* from root@"%";
6. 登录:mys ......
mysql的 find_in_set函数使用方法
很多时候我们在设计数据库时有这种情况,比如:
有个文章表里面有个type字段,他存储的是文章类型,有 1头条,2推荐,3热点,4图文 .....11,12,13等等
现在有篇文章他既是 头条,又是热点,还是图文,
type中以 1,3,4的格式存储.
那们我们如何用sql查找所有type中有4图文标准的文章呢 ......