热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

选择显示第一个唯一值的行-Selecttherowsthatappearwiththefirstuniquevalue

Forexample,Inowhave:例如,我现在有:C1C2C3---------------------A18B

For example, I now have:

例如,我现在有:

C1      C2        C3
---------------------
A       1         8
B       2         7
A       2         6
B       3         3
C       4         3

I want to use the actor as the reference and choose the very first appearnce of C1, which means I want to select the first, second, the fifth rows.

我想使用actor作为参考并选择C1的第一个出现,这意味着我想选择第一行,第二行,第五行。

How can I do that?

我怎样才能做到这一点?

Thank you very much.

非常感谢你。

1 个解决方案

#1


0  

I see three ways to do this, depending on whether you have a column that uniquely defines the order of the records, and which non-standard feature of MySql you are willing to use.

我看到有三种方法可以做到这一点,具体取决于你是否有一个唯一定义记录顺序的列,以及你愿意使用的MySql的非标准功能。

1. You have a column that uniquely defines the order

Let's say you have such a column and it is called id, then do this:

假设您有这样一个列,它被称为id,然后执行以下操作:

SELECT C1, C2, C3
FROM   T1
WHERE  id IN (
         SELECT Min(id)
         FROM   T1
         GROUP  BY C1);
2. You don't have a column that defines the order

In this case you rely completely on the order that MySql chooses for your query result.

在这种情况下,您完全依赖于MySql为查询结果选择的顺序。

There are two ways I can suggest to produce the desired result in this case, and since the first one is rather easy, the second one might not be that interesting after all.

在这种情况下,有两种方法可以建议产生所需的结果,并且由于第一种方法相当容易,所以第二种方法可能并不那么有趣。

2.1 Non-standard GROUP BY clause

MySql allows you to do a GROUP BY in combination with a SELECT list that contains non-grouped-by columns, which are not aggregated either. This is not allowed in standard SQL, and other engines refuse that kind of queries.

MySql允许您将GROUP BY与包含非分组列的SELECT列表结合使用,这些列也未聚合。标准SQL中不允许这样做,其他引擎拒绝这种查询。

But it works in MySql:

但它适用于MySql:

SELECT C1, C2, C3
FROM   T1
GROUP BY C1;

2.2. MySql User Variables

In this case you could get the desired output with user variables. During the execution of the SELECT you can collect the C1 values you have visited in a variable, and then add as a WHERE condition that any next C1 value may not be present in this variable:

在这种情况下,您可以使用用户变量获得所需的输出。在执行SELECT期间,您可以收集您在变量中访问过的C1值,然后添加为WHERE条件,以便此变量中可能不存在任何下一个C1值:

SELECT      C1, C2, C3
FROM        T1,
            (SELECT @done := '') as init
WHERE       NOT find_in_set(C1, @done)
AND         (@done := concat_ws(',', @done, C1)) is not null;

Output in all three cases:

C1      C2        C3
---------------------
A       1         8
B       2         7
C       4         3

SQL fiddle of last solution.

最后解决方案的SQL小提琴。

Explanation

The order of evaluation is as follows:

评估顺序如下:

  • The FROM clause is evaluated, and there the engine will assign the empty string to the variable @done;
  • 评估FROM子句,引擎将空字符串赋给变量@done;
  • For every record in the table, the WHERE clause is evaluated. If the first condition succeeds, it means that the value of C1 was never visited before, and so the next condition is evaluated, which always yield true, but will as a side-effect add the value of C1 to the string @done, separated by a comma;
  • 对于表中的每个记录,将评估WHERE子句。如果第一个条件成功,则意味着之前从未访问过C1的值,因此评估下一个条件,它总是产生true,但是作为副作用将C1的值添加到字符串@done中,分开用逗号;
  • If the first condition of the WHERE fails, this means the value of C1 was already visited before, and so the record will not be output. Also, because the first condition fails, the engine will not evaluate the second clause, as it already determined that the whole WHERE fails.
  • 如果WHERE的第一个条件失败,这意味着之前已经访问过C1的值,因此不会输出记录。此外,由于第一个条件失败,引擎将不会评估第二个子句,因为它已经确定整个WHERE失败。

推荐阅读
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • WhenIusepythontoapplythepymysqlmoduletoaddafieldtoatableinthemysqldatabase,itdo ... [详细]
author-avatar
谭禅心_136
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有