首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >按多列分组和标记唯一子组。

按多列分组和标记唯一子组。
EN

Stack Overflow用户
提问于 2014-09-08 17:57:00
回答 2查看 74关注 0票数 1

从这些数据开始:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+--------+------------+--------+--------+
| Fruit  | Vegetables | Colors | Number |
+--------+------------+--------+--------+
| Apple  | Beans      | Blue   |     10 |
| Apple  | Beans      | Blue   |     10 |
| Apple  | Beans      | Blue   |     20 |
| Apple  | Beans      | Blue   |     20 |
| Apple  | Beans      | Green  |     20 |
| Apple  | Beans      | Green  |     20 |
| Banana | Brocoli    | Red    |     10 |
| Banana | Brocoli    | Red    |     10 |
| Banana | Brocoli    | Blue   |     10 |
| Banana | Beans      | Blue   |     20 |
| Banana | Beans      | Green  |     20 |
| Banana | Beans      | Green  |     20 |
+--------+------------+--------+--------+

我想用水果来计算蔬菜、颜色和数字的独特组合。所以我从这个查询开始。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SET @a:=0;

select *, @a:=@a+1 as newid FROM(
select fruit, vegetable, color, number

FROM test

GROUP BY fruit, vegetable, color, number) as info

才能得到这些数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+-------+--------+------------+--------+--------+
| newid | Fruit  | Vegetables | Colors | Number |
+-------+--------+------------+--------+--------+
|     1 | Apple  | Beans      | Blue   |     10 |
|     2 | Apple  | Beans      | Blue   |     20 |
|     3 | Apple  | Beans      | Green  |     20 |
|     4 | Banana | Brocoli    | Red    |     10 |
|     5 | Banana | Brocoli    | Blue   |     10 |
|     6 | Banana | Beans      | Blue   |     20 |
|     7 | Banana | Beans      | Green  |     20 |
+-------+--------+------------+--------+--------+

但我的最终目标是到达这里

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
+----------+--------+------------+--------+--------+
|    ID    | Fruit  | Vegetables | Colors | Number |
+----------+--------+------------+--------+--------+
| Apple-1  | Apple  | Beans      | Blue   |     10 |
| Apple-1  | Apple  | Beans      | Blue   |     10 |
| Apple-2  | Apple  | Beans      | Blue   |     20 |
| Apple-2  | Apple  | Beans      | Blue   |     20 |
| Apple-3  | Apple  | Beans      | Green  |     20 |
| Apple-3  | Apple  | Beans      | Green  |     20 |
| Banana-1 | Banana | Brocoli    | Red    |     10 |
| Banana-1 | Banana | Brocoli    | Red    |     10 |
| Banana-2 | Banana | Brocoli    | Blue   |     10 |
| Banana-3 | Banana | Beans      | Blue   |     20 |
| Banana-4 | Banana | Beans      | Green  |     20 |
| Banana-4 | Banana | Beans      | Green  |     20 |
+----------+--------+------------+--------+--------+

我意识到我最终可以使用group_concat,但我不知道如何最好地在查询中重新开始计数器。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-08 18:28:05

首先,这会为你重新设定一个不同的水果的数量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT *, 
       if(@a = fruit, @b := @b + 1, @b := 1) as counter,
       @a := fruit
FROM (
    select fruit, vegetable, color, number
    FROM test
    GROUP BY fruit, vegetable, color, number
) t
CROSS JOIN (SELECT @a := null, @b := null)temp

但是要提供一个结果给你所期望的结果。尝尝这个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    CONCAT(fruit, ' ', counter) as fruit, vegetable, color, number
FROM
(   SELECT 
        *, 
        if(@a = fruit, if(@c = color AND @d = number, @b, @b := @b + 1), @b := 1) as counter,
        @a := fruit, @c := color, @d := number
    FROM test
    CROSS JOIN (SELECT @a := null, @b := null, @c := null, @d := null)temp
)t

基本上,对于第二个查询,您可以逐行进行比较,以查看上一行中的值是否为下一行中的值,如果没有,则重置计数器,如果它们随后不再重置而是递增,如果颜色和数字都匹配上一行,则只需输入该计数器值而不增加它。

演示

您必须在这里进行的关键评估是,在对计数器进行条件检查之后,将赋值分配给列变量。这样您就可以将前面的行值与当前的行值进行比较.有一点要注意的是,MySQL并不保证这种评估顺序会以这种方式发生。但通常从左到右计算。

票数 1
EN

Stack Overflow用户

发布于 2014-09-08 18:29:41

你的开局很好。你说得对,和大家在一起的困难。您可以这样做,但是您需要返回到原始表的联接操作,以获取所有行,

下面是另一种使用“技巧”的方法:将当前行的值保存在用户定义的变量中,以便将这些值与下一行的值进行比较。我们使用条件测试来确定是将计数器保留在其现有值上,还是将其增加一倍,或者将其重置为1。

我们在查询中使用一个ORDER BY子句来确保按行需要比较的顺序返回行;我们将比较每一行的值,即前一行的值。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT CONCAT(r.fruit,'-',r.i) AS ID
     , r.fruit
     , r.vegetable
     , r.color
     , r.number
  FROM ( SELECT IF( t.fruit <=> @fruit
                , IF( t.vegetable <=> @vegetable 
                  AND t.color     <=> @color
                  AND t.number    <=> @number
                  , @i := @i + 0
                  , @i := @i + 1
                  )
                , @i := 1
                ) AS i
              , @fruit     := t.fruit      AS fruit
              , @vegetable := t.vegetable  AS vegetable
              , @color     := t.color      AS color
              , @number    := t.number     AS number
           FROM ( SELECT @i         := 1
                       , @fruit     := NULL
                       , @vegetable := NULL
                       , @color     := NULL
                       , @number    := NULL
                ) i
          CROSS
           JOIN test t
          ORDER 
             BY t.fruit
              , t.vegetable
              , t.color
              , t.number
       ) r

作为i别名的内联视图初始化用户定义的变量(而不是依赖于单独的语句)。除了返回1行(因为我们指定了一个联接操作)外,我们实际上并不关心内联视图返回什么;我们真正关心的是,在运行它的查询之前对它进行评估。

要测试的交叉连接将使我们从测试中获得所有行。

我们指定order子句,以便按指定的顺序返回行。这一点很重要,因为我们将将一行中的值与前一行中的值进行比较。

“技巧”是一个表达式,它将当前行(例如t.fruit)的值与前一行的值进行比较:(例如@果树)。我们使用一个布尔表达式,如果所有列匹配,则返回true,如果为真,则增加计数器(@i)。否则,我们将计数器重置为1。

MySQL并不保证计算的顺序,但是我们注意到SELECT列表中的表达式是从左到右计算的,所以在重写保存上一行值的用户定义变量之前,我们要小心地执行条件测试。

我们将整个查询包装成parens,并给它一个别名,这样我们就可以运行另一个外部查询,将生成的计数器连接到一个字符串中(根据指定的结果集)。

一些**重要说明((:

这个语法是MySQL特有的;我们观察到的行为不能保证,但它是我们最接近于模拟其他数据库中可用的“分析函数”的语法。

请注意,在MySQL的未来版本中,此行为可能会发生变化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25735652

复制
相关文章
如何使用ReconAIzer将OpenAI添加到Burp中
ReconAIzer是一款功能强大的Burp Suite扩展,该工具基于Jython开发,可以为Burp Stuite添加OpenAI能力,并利用OpenAI来优化和增强渗透测试过程中的网络侦查任务。该工具专为漏洞猎人和渗透测试人员设计,支持以自动化的形式执行多种网络安全任务,可以帮助广大安全研究人员以简单快速的形式识别和利用漏洞。
FB客服
2023/08/08
2990
如何使用ReconAIzer将OpenAI添加到Burp中
将下载到本地的JAR包手动添加到Maven仓库(转)
常用Maven仓库网址: http://mvnrepository.com/ http://search.maven.org/ http://repository.sonatype.org/content/groups/public/ http://people.apache.org/repo/m2-snapshot-repository/ http://people.apache.org/repo/m2-incubating-repository/
HUC思梦
2020/09/03
1.9K0
将下载到本地的JAR包手动添加到Maven仓库(转)
将Sublime添加到鼠标右键
2、找到 HKEY_CLASSES_ROOT/*/shell 目录,在此目录下操作。
新码农
2020/03/05
3K0
IntelliJ IDEA 中的版本控制介绍(中)
由于 IntelliJ IDEA 支持的版本控制工具非常的多,但咱们真正能够用到的也就两三个而已,因此在本篇博文中,咱们主要介绍 SVN、Git 和 GitHub 的配置方法。 SVN 如果想要在 I
CG国斌
2018/01/26
1K0
Winform 后台将指定的控件集合添加到制定容器中
1 /// <summary> 2 /// 把按钮按照行数分割排列 3 /// </summary> 4 /// <param name="ControlArry">按钮集合</param> 5 /// <param name="control_parent">父容器</param> 6 /// <param name="RowCount">每一行数量</param> 7 ///
FreeTimeWorker
2020/08/31
2.3K0
[Go]Golang中控制并发的sync包
Mutex:互斥锁 RWMutex:读写锁 WaitGroup:等待组 Once:单次执行 Cond:信号量 Pool:临时对象池 Map:自带锁的map
唯一Chat
2021/03/11
5650
【GIT版本控制】--什么是版本控制
版本控制是在软件开发和许多其他领域中非常重要的工具,因为它解决了许多与协作、追踪更改和管理项目相关的问题。以下是一些主要原因,解释了为什么需要版本控制:
喵叔
2023/10/06
3140
将Windows Terminal添加到鼠标右键
导读 非常实用的小技巧。 下载Windows Terminal图标,右键另存为。 [WindowsTerminal图标] 保存至'C:\Users\Administrator\AppData\Local\Terminal\Terminal.ico'。 win+R输入'regedit',打开注册表。 找到'HKEY_CLASSES_ROOT\Directory\Background\shell'目录,在此目录下操作。 新建项'wt',双击右边'默认',更改右键文字显示内容'Windows Terminal H
新码农
2020/08/05
3.6K0
将Windows Terminal添加到鼠标右键
版本控制
每次发布 Web 服务时,都会为该 Web 服务分配一个版本。版本控制使用户能够更好地管理其 Web 服务的发布,并帮助使用您的服务的人轻松找到它。
冬夜先生
2022/02/27
1.3K0
将oracle驱动包加到maven中
2、确认maven环境变量已整确(cmd 中执行 mvn -v 显示maven的版本信息);
qubianzhong
2018/08/10
5060
Nexus高级配置之如何将本地jar添加到Nexus中
Java后端技术所推送文章,为本人原创、网上收集或其他作者投稿,对于网上收集部分除非确实无法确认,我们都会注明作者和来源。部分文章推送时未能与原作者取得联系。若涉及版权问题,烦请原作者联系我们,我们会在24小时内删除处理,谢谢!^_^ QQ:1573876303。
Java后端技术
2018/08/09
2.7K0
Nexus高级配置之如何将本地jar添加到Nexus中
微软计划将 ChatGPT 添加到 Bing 中,以吸引谷歌搜索用户
作者 | 褚杏娟 据彭博社报道,有知情人士透露,微软正准备将 OpenAI 的 ChatGPT 聊天机器人添加到其 Bing 搜索引擎中,以吸引竞争对手谷歌的用户。 这位知情人士表示,微软相信,对于搜索用户来说,提供更具对话性和上下文回复,可以比链接提供更好的答案,从而赢得用户。微软可能在未来几个月内推出附加功能,但现在仍在权衡聊天机器人的准确性以及将其纳入搜索引擎的速度。该知情人士表示,最初的版本可能是对一小部分用户的有限测试。 微软的 Bing 服务规模远小于 Alphabet Inc. 占主导地位的
深度学习与Python
2023/03/29
9270
微软计划将 ChatGPT 添加到 Bing 中,以吸引谷歌搜索用户
eclipse中如何删除已经添加到 Web App Libraries 中引用的jar包
在 eclipse 中的 动态web项目 中,例如:我们通过向  /bos19/WebContent/WEB-INF/lib 中添加我们需要用到的jar包,如下图所示:
黑泽君
2018/10/11
6.3K0
eclipse中如何删除已经添加到 Web App Libraries 中引用的jar包
dart - 将 orElse 函数添加到 firstWhere 方法
我正在尝试将 onElse 函数添加到 iterator.firstWhere 方法,但我无法获得正确的语法。 我试过类似的东西
徐建国
2021/08/31
1.6K0
将Emoji表情添加到项目中 顶
选择完需要的表情,点击消息预览就可以看到效果了,有一个微笑表情是QQ表情~~ 可以不用管它。
linapex
2019/03/26
1.8K0
将Emoji表情添加到项目中
                                                    顶
如何将MV中的音频添加到EasyNVR中做直播背景音乐?
EasyNVR已经支持自定义上传音频文件,可以做慢直播场景使用,前两天有一个开发者提出一个问题:想把一个MV中的音频拿出来放到EasyNVR中去做慢直播。
EasyNVR
2021/10/28
4.1K0
如何将MV中的音频添加到EasyNVR中做直播背景音乐?
将程序添加到右键菜单快速启动
打开注册表编辑器:按下 Win + R 键,输入 regedit,然后按回车键打开注册表编辑器。
浪漫主义狗
2023/09/04
4620
将程序添加到右键菜单快速启动
PostgreSQL中的多版本并发控制-MVCC
MVCC , Multi - Version Concurrency Control , 多版本控制并发
小徐
2020/05/01
1.9K0
PostgreSQL中的多版本并发控制-MVCC
IntelliJ IDEA 中的版本控制介绍(下)
在「IntelliJ IDEA 中的版本控制介绍」中,我们已经简单了解了 IntelliJ IDEA 的版本控制机制,那么接下来,就让我们一起看看在 IntelliJ IDEA 中进行具体的版本控制操
CG国斌
2018/01/26
2K0
PostgreSQL中的多版本并发控制-MVCC
MVCC , Multi - Version Concurrency Control , 多版本控制并发
小徐
2020/05/12
1.6K0
PostgreSQL中的多版本并发控制-MVCC

相似问题

SSIS包版本控制

30

控制Python包版本

11

厨师包版本控制

30

版本控制中的Oracle包?

50

查看package.json,将版本添加到包中

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文