例如,我现在有:
C1 C2 C3
---------------------
A 1 8
B 2 7
A 2 6
B 3 3
C 4 3
我想使用actor作为参考并选择C1的第一个出现,这意味着我想选择第一行,第二行,第五行。
我该怎么做?
非常感谢。
答案 0 :(得分:0)
我看到了三种方法,具体取决于你是否有一个唯一定义记录顺序的列,以及你愿意使用的MySql的非标准功能。
我们假设你有这样一个专栏,它被称为 id ,然后执行此操作:
SELECT C1, C2, C3
FROM T1
WHERE id IN (
SELECT Min(id)
FROM T1
GROUP BY C1);
在这种情况下,您完全依赖于MySql为查询结果选择的顺序。
在这种情况下,有两种方法可以建议产生预期的结果,并且由于第一种方法相当容易,所以第二种方法可能并不那么有趣。
MySql允许您将GROUP BY
与包含非分组列的SELECT
列表结合使用,这些列也未聚合。这在标准SQL中是不允许的,其他引擎拒绝这种查询。
但它适用于MySql:
SELECT C1, C2, C3
FROM T1
GROUP BY C1;
在这种情况下,您可以使用用户变量获得所需的输出。在执行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
失败。