GVKun编程网logo

MySQL-IN()中的ORDER BY值(mysql in order by)

8

在这篇文章中,我们将为您详细介绍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-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()

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()性能问题和解决方案

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。

然后至少有几个好的解决方案:

  1. >不使用=
    SELECT items FROM tablea where status=''0'' and id>''$id23'' LIMIT 1

创建索引(status,id,items)以使其成为仅索引的查询。

  1. 使用=,但如果找不到匹配项,请使用其他随机值再试一次。有时需要几次尝试,但通常只需一次尝试。本=应该是更快,因为它可以使用的主键。而且,如果它更快,并且90%的时间可以一次尝试,那么一次以上的尝试就可以弥补另外10%的时间。取决于您的ID值中有多少空白。

MySQL 查询结果倒叙后分组(先 order by,再按 order by 的结果 group by)

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

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;
登录后复制
效果如图2  是两种排序方式



接下去我们怎么进行分组:

比如说我们要统计老师的数目,然后对老师性别分别进行统计 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;
登录后复制
0是从第一条开始

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的相关信息,可以在本站进行搜索。

本文标签: