在这篇文章中,我们将为您详细介绍MySQL-IN的内容,并且讨论关于中的ORDERBY值的相关问题。此外,我们还会涉及一些关于MySQLORDERBYIN()、mysqlorderbyrand()性能
在这篇文章中,我们将为您详细介绍MySQL-IN的内容,并且讨论关于中的ORDER BY值的相关问题。此外,我们还会涉及一些关于MySQL ORDER BY IN()、mysql order by rand()性能问题和解决方案、MySQL 查询结果倒叙后分组(先 order by,再按 order by 的结果 group by)、Mysql 简单的命令语句续-*,as,group by,order by,group by,havin_MySQL的知识,以帮助您更全面地了解这个主题。
本文目录一览:- MySQL-IN()中的ORDER BY值(mysql in order by)
- MySQL ORDER BY IN()
- mysql order by rand()性能问题和解决方案
- MySQL 查询结果倒叙后分组(先 order by,再按 order by 的结果 group by)
- Mysql 简单的命令语句续-*,as,group by,order by,group by,havin_MySQL
MySQL-IN()中的ORDER BY值(mysql in order by)
我希望按照 在IN()函数中输入的顺序 对以下查询中返回的项目进行排序。
输入:
SELECT id, name FROM mytable WHERE name IN (''B'', ''A'', ''D'', ''E'', ''C'');
输出:
| id | name |^--------^---------^| 5 | B || 6 | B || 1 | D || 15 | E || 17 | E || 9 | C || 18 | C |
有任何想法吗?
答案1
小编典典SELECT id, nameFROM mytableWHERE name IN (''B'', ''A'', ''D'', ''E'', ''C'')ORDER BY FIELD(name, ''B'', ''A'', ''D'', ''E'', ''C'')
该场函数返回字符串的剩余列表中的第一个字符串的位置。
但是,在性能上要好得多,先有一个索引列代表您的排序顺序,然后再按此列进行排序。
MySQL ORDER BY IN()
我有一个带有ID编号的PHP数组。这些号码已经订购。
现在,我想通过IN()方法获取我的结果,以获取所有ID。
但是,这些ID的排序应类似于IN方法。
例如:
IN(4,7,3,8,9)
应该给出如下结果:
4 - Article 4 7 - Article 7 3 - Article 3 8 - Article 8 9 - Article 9
有什么建议么?也许有一个功能可以做到这一点?
谢谢!
答案1
小编典典我认为您可能正在寻找函数FIELD-通常被认为是字符串函数,但它也适用于数字!
ORDER BY FIELD(field_name, 3,2,5,7,8,1)
mysql order by rand()性能问题和解决方案
我使用rand()命令从数据库中生成随机行而没有任何问题,但我得知随着数据库大小的增加,此rand()会导致服务器负载沉重,因此我正在寻找另一种方法,并尝试通过生成一个随机数使用php
rand()函数并将其作为id放入mysql查询中,这非常快,因为mysql知道行ID,但问题是在我的表中所有数字都不可用。例如1,2,5,9,这样的12。
如果php rand()生成数字3,4等,则查询将为空,因为没有编号为3、4等的id。
从php生成随机数的最佳方法是什么,但是它应该在该表中生成可用的no,因此必须检查table.please。
$id23=rand(1,100000000); SELECT items FROM tablea where status=''0'' and id=''$id23'' LIMIT 1
上面的查询速度很快,但有时生成的查询不在数据库中不可用。
SELECT items FROM tablea where status=0 order by rand() LIMIT 1
上面的查询太慢,导致服务器上的负载很大
答案1
小编典典首先,全部生成一个从1到MAX(id)的随机值,而不是100000000。
然后至少有几个好的解决方案:
>
不使用=
SELECT items FROM tablea where status=''0'' and id>''$id23'' LIMIT 1
创建索引(status,id,items)
以使其成为仅索引的查询。
- 使用
=
,但如果找不到匹配项,请使用其他随机值再试一次。有时需要几次尝试,但通常只需一次尝试。本=
应该是更快,因为它可以使用的主键。而且,如果它更快,并且90%的时间可以一次尝试,那么一次以上的尝试就可以弥补另外10%的时间。取决于您的ID值中有多少空白。
MySQL 查询结果倒叙后分组(先 order by,再按 order by 的结果 group by)
业务前提:用户下单,订单归属于指定销售,审核通过的订单可以参与计算业绩。
需求描述:统计向,统计销售成单情况,要求显示指定销售人员最近审核通过的订单。
解决方案:暂列举3种,各有利弊,权衡取舍。
方案1:按需要GROUP BY的关键字段简单查询出全部数据,然后在程序中再次过滤、倒叙、取首。
局限性:批量查询时,数据量不可控,范围越大,内存越可能扛不住,单次查询结果量可预估时酌情考虑,不确定的话不推荐。
方案2:子查询的ORDER BY配合LIMIT使用。
局限性:对数据量有预估要求(本需求中要求覆盖user_order全表数据,不适用,未选择该方案)。
核心SQL如下:
SELECT
temp.sale_asset_id,
temp.last_passed_order_id,
temp.last_passed_order_create_time
FROM
(
SELECT
check.auth_user_id,
uo.id last_passed_order_id,
uo.create_time last_passed_order_create_time
FROM
user_order uo
INNER JOIN user_order_check check ON check.order_id = uo.id AND check.id = uo.sale_qc_check_id
WHERE
check.check_status = 200
AND check.auth_user_id IN (1,2,3)
ORDER BY
check.auth_user_id,
check.check_time DESC,
uo.id DESC
LIMIT 99999999
) temp
GROUP BY
temp.auth_user_id;
方案3:使用MAX函数针对倒叙条件“审核时间”取最大值,模拟倒叙。
局限性:需要对可能导致查询结果中GROUP BY字段数据非唯一的情况做考虑(本需求要求查询结果中销售数据唯一,影响唯一的字段是check_time(大)、create_time(小),若还有其他字段,则需要再次关联MAX的结果),影响字段越多,则关联的子查询越多,降低性能。
核心SQL如下:
SELECT
check.auth_user_id,
uo.id last_passed_order_id,
uo.create_time last_passed_order_create_time
FROM
user_order uo
INNER JOIN user_order_check check ON check.order_id = uo.id AND check.id = uo.sale_qc_check_id
/* 相同销售,按审核通过时间,取最近 */
INNER JOIN (
SELECT
auth_user_id,
MAX(check_time) max_time
FROM
user_order_check
WHERE
check_status = 200
AND auth_user_id IN (1,2,3)
GROUP BY
auth_user_id
) max_result_time ON max_result_time.auth_user_id = check.auth_user_id AND max_result_time.max_time = check.check_time
/* 相同销售,相同审核通过时间,取最近生成的订单(此类情况不易出现,如产品不考虑此类情况,可不关联该部分,有助于提高性能) */
INNER JOIN (
SELECT
auth_user_id,
MAX(order_id) max_order_id
FROM
user_order_check
WHERE
check_status = 200
AND auth_user_id IN (1,2,3)
GROUP BY
auth_user_id,
check_time
) max_result_order ON max_result_order.auth_user_id = check.auth_user_id AND max_result_order.max_order_id = check.order_id;
另:建议额外搭配合适的索引使用。
Mysql 简单的命令语句续-*,as,group by,order by,group by,havin_MySQL
-菜鸟在努力的学飞翔!
作为一枚菜鸟不容易啊,这个世界好难生存啊
继续在简陋的cmd命令里面敲击着sql命令!
首先这里着重的说下通配符*的问题!
如果让大家搜索全部的话 肯定是想也不想直接一个 select * from tablename 吧!
但是 这样的话是非常影响性能的!
如果你的列有很多的话!
因为在数据库里面
每次select * 都要把 * 解析成各个属性,所以当在实际开发当中千万不要偷懒
要列出自己要搜索的所有属性!从而提高整体的效率
for example:
select id,name,gender,age,job,createdate from teacher_tab order by createdate desc;
order by 列名 desc 是按照XXX排序 ,降序
order by 列名 不加,升序
效果如图1:
当你排列顺序遇到好多相等的时候,就可以考虑有第二列来排列
比如
select id,name,gender,age,job,createdate from teacher_tab order by createdate desc,age;
接下去我们怎么进行分组:
比如说我们要统计老师的数目,然后对老师性别分别进行统计 g=gg=男 m = mm = 女
代码如下“:
select gender ,count(gender) from teacher_tab group by gender;
效果如图3:
假如说我们只要计算m的个数,我们可以加having gender = ''m'';
如图4:
不过不建议用having 当数据庞大之后,我们要在分组后,又进行搜索话是极耗费性能的。
建议使用如下代码:
select gender,count(gender) from teacher_tab where gender = ''m'';
有时候我们对列名不太满意,想自定义使用其他的名字,这时候就需要用到as 别名了
代码如下:
select t.age,t.name from teacher_tab t;
select count(id) as counts from teacher_tab;
效果如图5:
还有使用limit 限制 limit 起始量,偏移量
for example :
select * from teacher_tab limit 0,3;
select * from teacher_tab limit 1,3;
1是指第二条开始
3是指0后面三条记录
效果如图6:
接下去是
事物的提交 回归等,下一篇再续
我们今天的关于MySQL-IN和中的ORDER BY值的分享就到这里,谢谢您的阅读,如果想了解更多关于MySQL ORDER BY IN()、mysql order by rand()性能问题和解决方案、MySQL 查询结果倒叙后分组(先 order by,再按 order by 的结果 group by)、Mysql 简单的命令语句续-*,as,group by,order by,group by,havin_MySQL的相关信息,可以在本站进行搜索。
本文标签: