例如,我现在有:
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
说明
评估顺序如下:
- 评估
FROM
子句,引擎会将空字符串分配给变量@done; - 对于表中的每条记录,都会评估
WHERE
子句。如果第一个条件成功,则意味着 C1 的值以前从未被访问过,因此会评估下一个条件,该条件始终产生 true,但会作为副作用添加 < strong>C1 到字符串 @done,以逗号分隔; - 如果
WHERE
的第一个条件不成立,则意味着C1的值之前已经被访问过,因此不会输出记录。此外,由于第一个条件失败,引擎将不会评估第二个子句,因为它已经确定整个WHERE
失败。
关于mysql - 选择显示第一个唯一值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35187443/