3

MySQLから- 選択 時に行番号を取得する この mysql クエリを使用して行番号/ランクを取得する方法を知っています。

SELECT @rn:=@rn+1 AS rank, itemID
FROM (
  SELECT itemID
  FROM orders
  ORDER BY somecriteria DESC
) t1, (SELECT @rn:=0) t2;

結果は次のようになります。

+--------+------+
| rank | itemID |
+--------+------+
|  1   |   265  |
|  2   |   135  |
|  3   |   36   |
|  4   |   145  |
|  5   |   123  |
|  6   |   342  |
|  7   |   111  |
+--------+------+

私の質問は次のとおりです: itemID 145 より低いランクのアイテムを返す 1 つの単純な SINGLE QUERY で結果を取得するにはどうすればよいですか?

+--------+------+
| rank | itemID |
+--------+------+ 
|  5   |   123  |
|  6   |   345  |
|  7   |   111  |
+--------+------+

Oracle sql クエリも歓迎されます。ありがとう。

4

2 に答える 2

2

Oracle ソリューション (「1 つの単純な単一クエリ」の基準を満たしているかどうかはわかりません):

WITH t AS
(SELECT item_id, row_number() OVER (ORDER BY some_criteria DESC) rn
   FROM orders)
SELECT t2.rn, t2.item_id
  FROM t t1 JOIN t t2 ON (t2.rn > t1.rn)
 WHERE t1.item_id = 145;

私の仮定は、item_id の値が繰り返されないことです。

これを MySQL 用語で表現しようとすると、おそらく次のようなものが機能する可能性があります。

SELECT t2.rank, t2.itemID
  FROM (SELECT @rn:=@rn+1 AS rank, itemID
          FROM (SELECT itemID
                  FROM orders
                 ORDER BY somecriteria DESC), (SELECT @rn:=0)) t1 INNER JOIN
       (SELECT @rn:=@rn+1 AS rank, itemID
          FROM (SELECT itemID
                  FROM orders
                 ORDER BY somecriteria DESC), (SELECT @rn:=0)) t2 ON t2.rank > t1.rank
 WHERE t1.itemID = 145;

免責事項: 私は MySQL をあまり使用しておらず、テストも行っていません。オラクルの作品は機能します。

于 2012-08-24T22:16:49.447 に答える
1
SELECT @rn:=@rn+1 AS rank, itemID
  FROM (
    SELECT itemID
    FROM orders
    ORDER BY somecriteria DESC
  ) t1, (SELECT @rn:=0) t2
where rank >
(
select rank from
   (
   SELECT @rn:=@rn+1 AS rank, itemID
   FROM 
       (
       SELECT itemID
       FROM orders
       ORDER BY somecriteria DESC
       ) t1, (SELECT @rn:=0) t2
   ) x where itemID = 145
) y
于 2012-08-24T15:06:02.963 に答える