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

标签 mysql sql database

例如,我现在有:

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

我想以 Actor 为引用,选择C1第一次出现,也就是说我想选择第一、二、五行。

我怎样才能做到这一点?

非常感谢。

最佳答案

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

1。您有一个唯一定义订单的列

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

SELECT C1, C2, C3
FROM   T1
WHERE  id IN (
         SELECT Min(id)
         FROM   T1
         GROUP  BY C1);

2。您没有定义顺序的列

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

在这种情况下,我可以建议两种方法来产生所需的结果,由于第一种方法相当简单,因此第二种方法可能就没那么有趣了。

2.1 非标准 GROUP BY 子句

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

但它在 MySql 中有效:

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

2.2。 MySql 用户变量

在这种情况下,您可以使用用户变量获得所需的输出。在执行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;

所有三种情况下的输出:

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

SQL fiddle of last solution .

说明

评估顺序如下:

  • 评估FROM子句,引擎会将空字符串分配给变量@done
  • 对于表中的每条记录,都会评估 WHERE 子句。如果第一个条件成功,则意味着 C1 的值以前从未被访问过,因此会评估下一个条件,该条件始终产生 true,但会作为副作用添加 < strong>C1 到字符串 @done,以逗号分隔;
  • 如果WHERE的第一个条件不成立,则意味着C1的值之前已经被访问过,因此不会输出记录。此外,由于第一个条件失败,引擎将不会评估第二个子句,因为它已经确定整个 WHERE 失败。

关于mysql - 选择显示第一个唯一值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35187443/

相关文章:

php - 用 php 或 mysql 翻译网站?

mysql - 将 XML 文件转换为 SQL 数据库的自动化方法?

sql - MySQL截断命令-unicode字符

php - 插入新记录后更新列

MySQL:在其他表中计数

php - 在mysql中为日期和时间选择数据类型

php - 用于搜索的 SQL 查询不返回任何结果

sql - Oracle中降序排列为什么先返回NULL值?

sql - Oracle 10g 中的数据透视表/交叉表查询(动态列号)

MYSQL仅列出特定类型应用程序的用户