我试图从水果表中获得一次订单,即使在此之前存在fruit_name,如果是这样的话:
我想要这份订单:Apple, Orange, Apple
或者如果我有以下情况:
我想要Apple, Orange, Strawberry
我尝试过这个查询,但是对于第一个场景,它不起作用。
select distinct fruit_name FROM fruit where ORDER BY fruit_id ASC
我怎么才能拿到呢?
我很感谢你的帮助。
发布于 2015-08-10 21:00:51
跟进我的注释--因为在SQL中行是无序的,我假设表有两个列: ID和Name。这假设ID是连续的-参见Sami对ID被排序但不一定是连续的情况的回答。既然如此,这样的事情就会被很好地定义:
select ID, Name
from Fruit F1
where F1.ID + 1 not in (
select ID
from Fruit F2
where F1.Name = F2.Name
) order by ID Asc这是通过选择所有水果名称来工作的,这样下面的水果名称与当前名称不一样。根据定义,我们总是在具有相同名称的行的运行中选择最后一行(因为运行后的行将具有不同的水果名称,因此它将满足WHERE子句)。鉴于此:
1 Apple
2 Apple
3 Orange
4 Orange
5 Orange
6 Apple
7 Apple您可以将此作为输出:
2 Apple
5 Orange
7 Apple发布于 2015-08-10 20:47:05
我想你是在把你的结果分组。你可以把你的结果分组,这样每个水果总是只有一个结果。但是,如果你是按名字分组,你不能让苹果显示两次-只有一次(见下面如何实现两个苹果的结果)。另外,我想奥朗是一个错误,它也应该是橙色。
这选择苹果,橘子,草莓
SELECT fruit_name FROM fruit GROUP BY name ORDER BY name此外,如果您想要不同的顺序,只需更改ORDER BY子句:
SELECT fruit_name FROM fruit GROUP BY name ORDER BY name = 'Orange' DESC, name以上查询选择橙、苹果、草莓
如果您的表的结构更复杂,您还可以获得2个Apple的结果。您只需要使用另一列来分组,例如,类似于apple_type
SELECT fruit_name FROM fruit GROUP BY fruit_name, apple_type记住:在一些数据库(如Oracle )中,您不能选择不在GROUP BY子句或聚合函数中的列,比如SUM()。
发布于 2015-08-10 20:51:19
假设您有一个具有用于排序的运行id的表,则可以这样做。让我们假设有一个表data,其中id列用于排序,name用于水果:
SELECT name FROM (
SELECT id, name, (SELECT COUNT(*) FROM data d
WHERE d.name<>data.name AND d.id<=data.id) as t
FROM data) x
GROUP BY name, t ORDER BY MIN(id)这将首先计算其他值中有多少在这些值之前,本质上进行分组。然后,当我们按水果和计数分组时,我们就可以区分实际的组。MIN(id)的排序确保它们的顺序是正确的,因为数据库可以返回它们,而不是它想要的。
https://stackoverflow.com/questions/31928636
复制相似问题