MySQL返回特定答案上下的行

时间:2013-04-13 23:32:23

标签: mysql phpmyadmin

我有一个简单数据表,其中包含三列,Id,人名和相关销售数字。按销售数字排名时,我无法确定如何返回上下行。

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

因此,例如,用户Ryan的总销售额为6.我如何将有5个销售额的Jim归还给他[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

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

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

感谢。

2 个答案:

答案 0 :(得分: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)

但是,虽然这样可以处理样本数据,但如果有多个行具有相同的Sales值,则只返回一个。

答案 1 :(得分: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语句中使用该值来返回具有该销售数字的所有entires 。第三个陈述显然是相反的(最大值低于瑞安)。中间语句只是找到ID 3(Ryan)的销售数字,然后返回任何相同的内容。联合中语句的顺序意味着它将按照您的示例按降序排序。但如果销售数字不是唯一的,它可能会返回如下内容:

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

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