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

时间:2016-02-03 20:51:28

标签: mysql sql database

例如,我现在有:

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

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

我该怎么做?

非常感谢。

1 个答案:

答案 0 :(得分:0)

我看到了三种方法,具体取决于你是否有一个唯一定义记录顺序的列,以及你愿意使用的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失败。