我按日期对行进行排序。如果我想选择最后一列中具有唯一值的每一行,我可以使用sql执行此操作吗?
所以我想选择第一行,第二行,第三行,第四行,我想选择,等等。
答案 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