我有一个简单数据表,其中包含三列,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
这个错误,理论上只会返回查询的行和它下面的行。
如何实现这一结果?因为我似乎无法按销售数字订购。
感谢。
答案 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
这取决于您希望如何处理销售数据不唯一的情况,以及您希望如何对其进行二次排序。