mysql - 无法在我的查询请求中显示额外的属性
问题描述
这是我正在处理的小推销员表:
+-------+--------------+--------+
| 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;
您可以分享的任何提示或想法将不胜感激。
解决方案
试试这个。
询问
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
发表声明。
推荐阅读
- python - 如何在 Matplotlib 中合并使用不同 excel 文件的数据?
- c - 关于运行 strtol 后剩余的内容
- javascript - 在使用 redux + react 时表示忽略 403 错误
- c# - How to create a database from sql script using Entity Framework Core?
- javascript - How to hide element with jquery depends on cookie value?
- c - How to read pixels of an image in c?
- macros - Verilog `ifdef 是否响应环境变量?
- entity-framework - EF Core 在保存附加实体时抛出 DbUpdateConcurrencyException
- python - 将菜单项添加到 Django 管理站点
- r - 闪亮和清洁的临时文件中的关闭会话问题