如果字段值是唯一的,则仅选择行

时间:2012-05-08 12:44:04

标签: mysql

我按日期对行进行排序。如果我想选择最后一列中具有唯一值的每一行,我可以使用sql执行此操作吗?

所以我想选择第一行,第二行,第三行,第四行,我想选择,等等。

enter image description here

3 个答案:

答案 0 :(得分:3)

您想要的不是唯一行,而是每组一个。这可以通过MIN(pk_artikel_Id)GROUP BY fk_artikel_bron来完成。此方法使用IN子查询为每个唯一pk_artikel_id获取第一个fk_artikel_bron及其关联的fk_artikel_bron,然后使用该子查询获取外部查询中的其余列。< / p>

SELECT * FROM tbl 
WHERE pk_artikel_id IN
  (SELECT MIN(pk_artikel_id) AS id FROM tbl GROUP BY fk_artikel_bron)

虽然MySQL允许你最初添加SELECT列表中的其余列,但是避免使用IN子查询,这对于其他RDBMS系统来说并不是真正可移植的。这种方法更通用。

也可以使用针对子查询的JOIN来完成,这可能会更快,也可能不会更快。很难说没有基准测试。

SELECT * 
FROM  tbl
  JOIN (
    SELECT 
      fk_artikel_bron, 
      MIN(pk_artikel_id) AS id
    FROM tbl
    GROUP BY fk_artikel_bron) mins ON tbl.pk_artikel_id = mins.id

答案 1 :(得分:2)

这类似于迈克尔的答案,但它是通过自联接而不是子查询来实现的。试试看它的表现如何:

SELECT * from tbl t1
LEFT JOIN tbl t2
  ON t2.fk_artikel_bron = t1.fk_artikel_bron
  AND t2.pk_artikel_id < t1.pk_artikel_id
WHERE t2.pk_artikel_id IS NULL

如果您有正确的索引,这种类型的连接通常会执行子查询(因为派生表不使用索引)。

答案 2 :(得分:-1)

这个非标准的,仅限mysql的技巧将选择为pk_artikel_bron的每个值遇到的第一行。

select *
...
group by pk_artikel_bron

不管你喜不喜欢,这个查询会产生要求的输出。

被修改

我似乎在这里受到了重创,所以这是免责声明:

这仅适用于mysql 5 +

虽然mysql规范说使用这种技术返回的行是不可预测的(即你可以得到任何行作为遇到的“第一个”),事实上在我见过的所有情况下,你都会得到第一行根据所选的顺序,所以要获得一个可以在练习中运行的可预测行(但可能在以后的版本中可能无效但可能会有效),请从有序结果中选择:

select * from (
    select *
    ... 
    order by pk_artikel_id) x
group by pk_artikel_bron