这是我几个小时以来一直在想的东西,但仍然无法得到答案。我想得到排位。
所以,我有一个名为'orders'的mysql表
+-----------------------------+
+ id | bid +
+-----------------------------+
+ 1 | 4.00 +
+ 2 | 6.00 +
+ 3 | 5.00 +
+ 4 | 4.00 +
+-----------------------------+
我已经设法通过此功能获得行位置
SELECT p.*, (SELECT count(*) FROM orders WHERE bid > p.bid) AS position FROM orders p
输出
+-----------------------------+
+ id | bid | position +
+-----------------------------+
+ 1 | 4.00 | 3 +
+ 2 | 6.00 | 1 +
+ 3 | 5.00 | 2 +
+ 4 | 4.00 | 3 +
+-----------------------------+
请注意,如果值相同,则它们具有相同的位置。
所以我现在需要的是一个查询,我选择一个新的出价(表中不存在)并告诉我这个出价将在哪个位置。它应该是这样的:如果我的新出价是7.00,它将在哪个位置? (答案:1位),另一个例子:如果我的新出价是4.00,它将在哪个位置? (回答:3位)
我正在寻找在SQL中完成此操作。如果不可能那么我会想要一个php答案。
我希望你们可以帮我解决这个问题,我在最后几个小时里一直在烧我的脑袋而未能完成这件事。
非常感谢你。
答案 0 :(得分:2)
首先,我认为您应该在子查询中添加DISTINCT关键字。因为如果我们向表中添加bid=3
,那么您的查询将获得position = 5
。因此4
将被遗漏。
SELECT p.*,
(SELECT count(DISTINCT bid)+1
FROM orders WHERE bid > p.bid) AS position
FROM orders p
现在我们需要知道新bid
的位置。只需使用子查询:
SELECT count(DISTINCT bid)+1 FROM orders WHERE bid > 4
答案 1 :(得分:0)
获取所有不同的出价并追加排名,然后加入。
SELECT t1.*, t2.position
FROM orders t1
LEFT JOIN (
SELECT bid, @i:=@i+1 AS position
FROM (
SELECT DISTINCT bid
FROM orders
ORDER by bid DESC
) a, (SELECT @i:=0) b
) t2 ON t1.bid = t2.bid
<强> THE SQLFiddle DEMO. 强>
答案 2 :(得分:0)
如何简单
SELECT count(*)+1 as position FROM orders WHERE bid > :new_bid