我试图从水果表中获取一次订单,即使fruit_name
之前存在,如果我有这种情况:
我想收到此订单:Apple, Orange, Apple
或如果我有以下内容:
我想获得Apple, Orange, Strawberry
我已尝试过此查询,但它不适用于第一种情况。
select distinct fruit_name FROM fruit where ORDER BY fruit_id ASC
我怎样才能得到它?
我感谢任何帮助。
答案 0 :(得分:1)
我认为你在谈论对结果进行分组。您可以对结果进行分组,这样每个水果只会有一个结果。但是,如果按名称进行分组,则不能将 Apple 显示两次 - 仅显示一次(请参阅下文如何实现两个 Apple 结果)。另外,我猜 Orang 是一个错字,它也应该是 Orange 。
选择 Apple,Orange,Strawberry :
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
上面的查询选择了 Orange,Apple,Strawberry
如果您的表格结构更复杂,您还可以获得2 Apple 结果。您只需要使用其他列进行分组,例如 apple_type :
SELECT fruit_name FROM fruit GROUP BY fruit_name, apple_type
请记住:在某些数据库(如Oracle)中,您无法选择不在GROUP BY
子句中的列或其他聚合函数,例如 SUM()。
答案 1 :(得分:1)
假设您有一个带有运行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)
排序可确保以正确的顺序获取它们,因为数据库可以返回它们,但是否则需要它们。
答案 2 :(得分:1)
跟进我的评论 - 由于行在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
答案 3 :(得分:0)
您可以执行以下简单查询:
select distinct(fruit_name) from fruit_table order by fruit_name;