首页 > 解决方案 > 无法在我的查询请求中显示额外的属性

问题描述

这是我正在处理的小推销员表:

+-------+--------------+--------+
| empId | name         | gender |
+-------+--------------+--------+
|     3 | Suresh Raina | M      |
|     5 | Andrew       | M      |
|     7 | Moeen        | F      |
|    11 | Moeen        | M      |
+-------+--------------+--------+

我必须在查询中显示以下内容:

name       count
Andrew       1
Moeen        2 (7,Moeen,F)(11,Moeen,M)
Suresh Raina 1

如果 count 有多个匹配的名称,那么它会显示所有属性。

我有以下查询,但它没有打印计数高于 1 的查询。

select all  name, count( name) AS totalNumber 
  from Salesman GROUP BY name HAVING COUNT(name)= 1 OR COUNT(name)>1 IN 
   ( select group_concat(empId ,name , gender) from Salesman group by name ) order by name asc;

您可以分享的任何提示或想法将不胜感激。

标签: mysql

解决方案


试试这个。

询问

select
  name,
  count(*) as count,
  case when count(*) < 2 then ''
  else
  concat('(',
    group_concat(
      concat_ws(',', empid, name, gender)
      separator '),('
    ),
    ')'
  )
  end as flds
from salesman
group by name

结果

姓名 | 计数 | 流域                    
:----------- | ----: | :------------------------
安德鲁 | 1 |                         
摩恩 | 2 | (7,摩恩,F),(11,摩恩,M)
苏雷什雷纳 | 1 |                         

例子

https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=9a804f0ac1a7290af61ce3649670358c

解释

从这个开始:

select name, count(*) as counter
from salesman
group by name

这会给你名字和数量。这都很好。

现在,您想要组合这些字段。所以,你可以使用concat_ws. 该函数的第一个参数将是分隔符。我们将使用,. 然后将是字段列表。

因此,concat_ws(',', name, gender)将返回John,M或每行中的名称是什么。我们将利用这一点。

由于我们想将 concat_ws 与 count(*) 一起使用,我们需要对 concat_ws 进行某种汇总。我们使用 group_concat 来做到这一点。

select name, count(*) as counter, group_concat(concat_ws(',', empid, name, gender))
from salesman
group by name

给我们

姓名 | 柜台 | group_concat(concat_ws(',', empid, 姓名, 性别))
:----------- | ------: | :------------------------------------------------
安德鲁 | 1 | 5,安德鲁,M                                       
摩恩 | 2 | 7,摩恩,F,11,摩恩,M                             
苏雷什雷纳 | 1 | 1,苏雷什雷纳,M                                 

好吧,我们更近了。现在,我们给 group_concat 一个分隔符。这将记录分开。我们使用单独),(的,这样查询就变成了这样:

select name, count(*) as counter,
  group_concat(concat_ws(',', empid, name, gender) separator '),(')
from salesman
group by name

> <pre>
> name         | counter | group_concat(concat_ws(',', empid, name, gender) separator '),(')
> :----------- | ------: | :----------------------------------------------------------------
> Andrew       |       1 | 5,Andrew,M                                                       
> Moeen        |       2 | 7,Moeen,F),(11,Moeen,M                                           
> Suresh Raina |       1 | 1,Suresh Raina,M                                                 
> </pre>

更近了。我们剩下的就是在我们的组 concat 周围添加左括号和右括号。一旦我们这样做了,我们就会得到一个干净的输出。

但是,我们不希望公布 Andrew 和 Suresh 的信息,因为他们的计数是 1。所以,我们case when ... else ... end发表声明。


推荐阅读