1. ホーム
  2. sql

[解決済み] MySQLはORDER BYで行の位置を取得する

2023-02-28 15:32:15

質問

以下のMySQLテーブルを使用します。

+-----------------------------+
+ id INT UNSIGNED             +
+ name VARCHAR(100)           +
+-----------------------------+

を選択するにはどうしたらよいですか? シングル でソートしたときに、テーブルの他の行との間の位置と name ASC . つまり、テーブルのデータを名前でソートすると、次のようになります。

+-----------------------------+
+ id | name                   +
+-----------------------------+
+  5 | Alpha                  +
+  7 | Beta                   +
+  3 | Delta                  +
+ .....                       +
+  1 | Zed                    +
+-----------------------------+

どのようにすれば Beta 行の現在の位置を取得するにはどうしたらよいでしょうか?私が探している結果セットは、次のようなものです。

+-----------------------------+
+ id | position | name        +
+-----------------------------+
+  7 |        2 | Beta        +
+-----------------------------+

単純な SELECT * FROM tbl ORDER BY name ASC を実行し、PHPで行を列挙することができますが、1つの行のために潜在的に大きな結果セットをロードするのは無駄のように思えます。

どのように解決するのですか?

これを使います。

SELECT x.id, 
       x.position,
       x.name
  FROM (SELECT t.id,
               t.name,
               @rownum := @rownum + 1 AS position
          FROM TABLE t
          JOIN (SELECT @rownum := 0) r
      ORDER BY t.name) x
 WHERE x.name = 'Beta'

...一意な位置の値を得ることができます。これは

SELECT t.id,
       (SELECT COUNT(*)
          FROM TABLE x
         WHERE x.name <= t.name) AS position,
       t.name    
  FROM TABLE t      
 WHERE t.name = 'Beta'

...は同値を与えることになります。 IE: 2位に2つの値がある場合、最初のクエリが一方に2、もう一方に3の位置を与えるとき、それらは両方とも2の位置を持つことになります...