MySQL在查询中获取行位置

时间:2014-03-20 06:25:57

标签: php mysql sql

这是我几个小时以来一直在想的东西,但仍然无法得到答案。我想得到排位。

所以,我有一个名为'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答案。

我希望你们可以帮我解决这个问题,我在最后几个小时里一直在烧我的脑袋而未能完成这件事。

非常感谢你。

3 个答案:

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

SQLFiddle demo

现在我们需要知道新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