GVKun编程网logo

GROUP_CONCAT ORDER BY

29

关于GROUP_CONCATORDERBY的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于BigQueryGROUP_CONCAT和ORDERBY、concat和concat_ws()区别

关于GROUP_CONCAT ORDER BY的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于BigQuery GROUP_CONCAT和ORDER BY、concat和concat_ws()区别及group_concat() ,repeat()字符串函数_MySQL、concat,concat_ws和group_concat函数的区别、django: ORM 实现 group by/group_concat 功能等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

GROUP_CONCAT ORDER BY

GROUP_CONCAT ORDER BY

我有一张桌子,像:

+-----------+-------+------------+| client_id | views | percentage |+-----------+-------+------------+|         1 |     6 |         20 ||         1 |     4 |         55 ||         1 |     9 |         56 ||         1 |     2 |         67 ||         1 |     7 |         80 ||         1 |     5 |         66 ||         1 |     3 |         33 ||         1 |     8 |         34 ||         1 |     1 |         52 |

我试过了group_concat

SELECT li.client_id, group_concat(li.views) AS views,  group_concat(li.percentage) FROM li GROUP BY client_id;+-----------+-------------------+-----------------------------+| client_id | views             | group_concat(li.percentage) |+-----------+-------------------+-----------------------------+|         1 | 6,4,9,2,7,5,3,8,1 | 20,55,56,67,80,66,33,34,52  |+-----------+-------------------+-----------------------------+

但我想按顺序获取视图,例如:

+-----------+-------------------+----------------------------+| client_id | views             | percentage                 |+-----------+-------------------+----------------------------+|         1 | 1,2,3,4,5,6,7,8,9 | 52,67,33,55,66,20,80,34,56 |+-----------+-------------------+----------------------------+

答案1

小编典典

您可以通过以下方式ORDER BYGROUP_CONCAT函数内部使用:

SELECT li.client_id, group_concat(li.percentage ORDER BY li.views ASC) AS views, group_concat(li.percentage ORDER BY li.percentage ASC) FROM li GROUP BY client_id

BigQuery GROUP_CONCAT和ORDER BY

BigQuery GROUP_CONCAT和ORDER BY

我目前正在使用BigQuery和GROUP_CONCAT,它们工作得很好。但是,当我尝试像在SQL中那样将ORDER
BY子句添加到GROUP_CONCAT语句时,会收到错误消息。

因此,例如

SELECT a,GROUP_CONCAT(b ORDER BY c) FROM test GROUP BY a

如果我尝试指定分隔符,也会发生相同的情况。

关于如何解决这个问题的任何想法?

concat和concat_ws()区别及group_concat() ,repeat()字符串函数_MySQL

concat和concat_ws()区别及group_concat() ,repeat()字符串函数_MySQL

1、concat()函数
    1.1 mysql的concat函数可以连接一个或者多个字符串,如
        mysql> select concat(''10'');
        +--------------+
        | concat(''10'') |
        +--------------+
        | 10           |
        +--------------+
       1 row in set (0.00 sec)

       mysql> select concat(''11'',''22'',''33'');
        +------------------------+
        | concat(''11'',''22'',''33'') |
        +------------------------+
        | 112233                 |
        +------------------------+

       1 row in set (0.00 sec)

       而Oracle的concat函数只能连接两个字符串

        SQL> select concat(''11'',''22'') from dual;

点击下载“修复打印机驱动工具”;

   1.2 MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL

        mysql> select concat(''11'',''22'',null);
        +------------------------+
        | concat(''11'',''22'',null) |
        +------------------------+
        | NULL                   |
        +------------------------+
       1 row in set (0.00 sec)

       而Oracle的concat函数连接的时候,只要有一个字符串不是NULL,就不会返回NULL

        SQL> select concat(''11'',NULL) from dual;
       CONCAT
       --
       11

2、concat_ws()函数, 表示concat with separator,即有分隔符的字符串连接
    如连接后以逗号分隔
        mysql> select concat_ws('','',''11'',''22'',''33'');

        +-------------------------------+
        | concat_ws('','',''11'',''22'',''33'') |
        +-------------------------------+
        | 11,22,33                      |
        +-------------------------------+
       1 row in set (0.00 sec)

   和concat不同的是, concat_ws函数在执行的时候,不会因为NULL值而返回NULL
        mysql> select concat_ws('','',''11'',''22'',NULL);
        +-------------------------------+
        | concat_ws('','',''11'',''22'',NULL) |
        +-------------------------------+
        | 11,22                         |
        +-------------------------------+
       1 row in set (0.00 sec)

3、group_concat()可用来行转列, Oracle没有这样的函数 (mysql4.1及以上 )

    完整的语法如下
    group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator ''分隔符''])
   如下例子
    mysql> select * from aa;

    +------+------+
    | id   | name |
    +------+------+
    |    1 | 10   |
    |    1 | 20   |
    |    1 | 20   |
    |    2 | 20   |
    |    3 | 200  |
    |    3 | 500  |
    +------+------+
   6 rows in set (0.00 sec)
   3.1 以id分组,把name字段的值打印在一行,逗号分隔(默认)
       mysql> select id,group_concat(name) from aa group by id;
        +------+--------------------+
        | id   | group_concat(name) |
        +------+--------------------+
        |    1 | 10,20,20           |
        |    2 | 20                 |
        |    3 | 200,500            |
        +------+--------------------+

       3 rows in set (0.00 sec)

   3.2 以id分组,把name字段的值打印在一行,分号分隔
        mysql> select id,group_concat(name separator '';'') from aa group by id;
        +------+----------------------------------+
        | id   | group_concat(name separator '';'') |
        +------+----------------------------------+
        |    1 | 10;20;20                         |
        |    2 | 20                               |
        |    3 | 200;500                          |
        +------+----------------------------------+

       3 rows in set (0.00 sec)

   3.3 以id分组,把去冗余的name字段的值打印在一行,逗号分隔

        mysql> select id,group_concat(distinct name) from aa group by id;

        +------+-----------------------------+
        | id   | group_concat(distinct name) |
        +------+-----------------------------+
        |    1 | 10,20                       |
        |    2 | 20                          |
        |    3 | 200,500                     |
        +------+-----------------------------+

       3 rows in set (0.00 sec)

   3.4 以id分组,把name字段的值打印在一行,逗号分隔,以name排倒序

        mysql> select id,group_concat(name order by name desc) from aa group by id;

        +------+---------------------------------------+
        | id   | group_concat(name order by name desc) |
        +------+---------------------------------------+
        |    1 | 20,20,10                              |
        |    2 | 20                                    |
        |    3 | 500,200                               |
        +------+---------------------------------------+

       3 rows in set (0.00 sec)

4、repeat()函数,用来复制字符串,如下''ab''表示要复制的字符串,2表示复制的份数

    mysql> select repeat(''ab'',2);

    +----------------+
    | repeat(''ab'',2) |
    +----------------+
    | abab           |
    +----------------+

   1 row in set (0.00 sec)

   又如
    mysql> select repeat(''a'',2);

    +---------------+
    | repeat(''a'',2) |
    +---------------+
    | aa            |
    +---------------+
   1 row in set (0.00 sec)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shuicaohui5/archive/2008/10/23/3129489.aspx

concat,concat_ws和group_concat函数的区别

concat,concat_ws和group_concat函数的区别

一、concat()函数

  1、定义:将多个字符串连接成一个字符串。

  2、使用语法:concat(str1,''-'' str2,...)

    返回字符串参数不能为null,否则返回值为null。

  举例

二、concat_ws()函数

  1、定义:将多个字符串连接成一个字符串,可以一次性指定分隔符-,要不然有10个参数写10个太麻烦了。

  2、使用语法:concat(''-'',str1, str2,...)

    返回字符串参数可以为空,但分隔符不能为null,否则返回值为null。

  举例

三、group_concat()函数

  1、定义:参数是可以直接使用order by排序的,适合多表查询,把对应表和这个表相关的组成一个组一条记录。

  2、使用语法:concat(str1, str2 order by str2 asc separator ''~'')

  举例

 

django: ORM 实现 group by/group_concat 功能

django: ORM 实现 group by/group_concat 功能

 

原始 SQl 语句: select ip, group_concat(id) as id from whitelist group by ip; 

 

方法一:

Django-ORM 实现:

1、创建 Concat 类:

from django.db.models import Aggregate, CharField

class Concat(Aggregate):
    """ORM用来分组显示其他字段 相当于group_concat"""
    function = ''GROUP_CONCAT''
    template = ''%(function)s(%(distinct)s%(expressions)s)''

    def __init__(self, expression, distinct=False, **extra):
        super(Concat, self).__init__(
            expression,
            distinct=''DISTINCT '' if distinct else '''',
            output_field=CharField(),
            **extra)

 

2、 使用模型类管理器查询

WhiteList.objects.values(''ip'').annotate(id=Concat(''id''))

 

# 待验证

 

方法二:

当模型查询 API 不够用时,您可以回退到编写原始 SQL。Django 为您提供了两种执行原始 SQL 查询的方法:您可以使用 Manager.raw()执行原始查询并返回模型实例,也可以完全避免模型层并直接执行自定义 SQL。

Django gives you two ways of performing raw SQL queries: you can use Manager.raw() to perform raw queries and return model instances, or you can avoid the model layer entirely and execute custom SQL directly.

使用 Manage.raw (sql 语句)

class Person(models.Model):
    first_name = models.CharField(...)
    last_name = models.CharField(...)
    birth_date = models.DateField(...)


>>> Person.objects.raw(''''''SELECT first AS first_name,
...  last AS last_name, ...  bd AS birth_date, ...  pk AS id, ...  FROM some_other_table'''''')

 

方法三:

在即将推出的 Django 1.8 中你可以实现 GroupConcat 表达式,然后查询看起来像:

Event.objects.values(''slug'').annotate(emails=GroupConcat(''task__person__email''))

.values ().annotate () 组合将 GROUP BY 设置为 slug,当然 GroupConcat 实现进行实际聚合。

 

关于GROUP_CONCAT ORDER BY的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于BigQuery GROUP_CONCAT和ORDER BY、concat和concat_ws()区别及group_concat() ,repeat()字符串函数_MySQL、concat,concat_ws和group_concat函数的区别、django: ORM 实现 group by/group_concat 功能的相关知识,请在本站寻找。

本文标签: