我按日期对行进行排序。如果我想选择最后一列中具有唯一值的每一行,我可以用 sql 执行此操作吗?
所以我想选择第一行,第二行,第三行不,第四行我想选择,依此类推。
您想要的不是唯一的行,而是每组一个。这可以通过使用MIN(pk_artikel_Id)
and来完成GROUP BY fk_artikel_bron
。此方法使用IN
子查询来获取每个唯一的第一个pk_artikel_id
及其关联的列,然后使用它来获取外部查询中的剩余列。fk_artikel_bron
fk_artikel_bron
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
这类似于迈克尔的答案,但它使用自联接而不是子查询。试试看它的表现如何:
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
如果您有正确的索引,这种类型的连接通常会执行子查询(因为派生表不使用索引)。
这种非标准的,仅限 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