2

我有一个简单数据表,其中包含三列、一个 ID、人员姓名和相关的销售数字。当按销售数字排名时,我不知道如何返回上面和下面的行。

id | Name | Sales
---|------|------
0  | Tim  | 9
1  | Jim  | 5
2  | Joe  | 3
3  | Ryan | 6
4  | Phil | 7
5  | James| 1

因此,例如,用户 Ryan 的总销售额为 6。我将如何返回 Jim,他有 5 个销售额,在他下方 [Ryan],然后 Phil 在他上方 [Ryan] 有 7。我尝试了几个查询甚至一分为二。使用查询,如果输出此结果:

id | Name | Sales
---|------|------
4  | Phil | 7
3  | Ryan | 6
1  | Jim  | 5



select * from SalesFigures where id >= '3' LIMIT 2 ORDER BY Sales ASC

这个错误,理论上只会返回查询的行和它下面的行。

这个结果将如何实现?因为我似乎无法按销售数字订购。

谢谢。

4

2 回答 2

1

我会使用这样的东西:

SELECT SalesFigures.*
FROM
  SalesFigures INNER JOIN (
  SELECT s1.Sales v1, MAX(s2.Sales) v2, MIN(s3.Sales) v3
  FROM
    SalesFigures s1 LEFT JOIN SalesFigures s2
    ON s1.Sales > s2.Sales
    LEFT JOIN SalesFigures s3
    ON s1.Sales < s3.Sales
  WHERE
    s1.ID =3) m ON SalesFigures.Sales IN (m.v1, m.v2, m.v3)

使用 UNION 查询将如下所示:

SELECT SalesFigures.*
FROM SalesFigures WHERE ID=3
UNION ALL
(SELECT SalesFigures.*
 FROM SalesFigures INNER JOIN SalesFigures s
      ON SalesFigures.Sales < s.Sales
 WHERE s.ID = 3
 ORDER BY SalesFigures.Sales DESC LIMIT 1)
UNION ALL
(SELECT SalesFigures.*
 FROM SalesFigures INNER JOIN SalesFigures s
      ON SalesFigures.Sales > s.Sales
 WHERE s.ID = 3
 ORDER BY SalesFigures.Sales LIMIT 1)

但是,虽然这适用于示例数据,但如果有多行具有相同的销售值,它将只返回一个。

于 2013-04-14T00:02:23.833 回答
1

首先,您会收到一个错误,因为该LIMIT子句必须在该子句之后ORDER BY。在您的示例中,它们是错误的方法,但是 SQL 中子句的顺序很重要。

使用 UNION 我会这样做:

(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT MIN(sales) FROM salesfigures 
   WHERE sales > (SELECT sales FROM salesfigures where id=3)))
UNION
(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT sales FROM salesfigures WHERE id=3))
UNION
(SELECT id, name, sales
FROM salesfigures
WHERE sales = (SELECT MAX(sales) FROM salesfigures 
   WHERE sales < (SELECT sales FROM salesfigures where id=3)))

嵌套的 subselect 语句有点难看,但它结合了三个 select 语句来查找销售额立即大于等于且小于 ID 为 3 的用户。

在第一个语句中,它找到 ID 3 (Ryan) 的销售数据,然后在 SELECT 语句中使用它来找到高于它的最小值,然后在 SELECT 语句中使用它来返回具有该销售数据的所有整数。第三个陈述显然是相反的(最大值低于 Ryan 的)。中间的语句简单地找到 ID 3 (Ryan) 的销售数字,然后返回任何相同的值。联合中语句的顺序意味着它将根据您的示例按降序排序。但如果销售数据不是唯一的,它可能会返回如下内容:

id | Name   | Sales
---|--------|------
12 | George | 7
4  | Phil   | 7
9  | Pat    | 6
23 | Tony   | 6
3  | Ryan   | 6
1  | Jim    | 5

这取决于您希望如何处理销售数据不唯一的情况,以及您希望如何对它们进行二次排序。

于 2013-04-14T01:37:37.877 回答