从水果桌上获取水果订单

时间:2015-08-10 20:34:44

标签: mysql

我试图从水果表中获取一次订单,即使fruit_name之前存在,如果我有这种情况:

  1. 苹果
  2. 苹果
  3. 苹果
  4. 苹果
  5. 我想收到此订单:Apple, Orange, Apple

    或如果我有以下内容:

    1. 苹果
    2. 苹果
    3. 草莓
    4. 草莓
    5. 草莓
    6. 我想获得Apple, Orange, Strawberry

      我已尝试过此查询,但它不适用于第一种情况。

      select distinct fruit_name FROM fruit where ORDER BY fruit_id ASC

      我怎样才能得到它?

      我感谢任何帮助。

4 个答案:

答案 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;