2012-04-24 9 views
2

私はテーブルbaskets,fruitsbasket_fruits(参加テーブル:basket_id-fruit_id)を持っています。ポジションに参加

私はバスケットに各果実の位置を返すことができますどのように私はなりますので、何か

+---------------------------------------+ 
| basket_id | fruit_id | fruit_position | 
|---------------------------------------| 
| 1   | 2  | 1    | 
| 1   | 5  | 2    | 
+---------------------------------------+ 

のようなフルーツの位置が返された結合テーブル内の行の数だけ(それが列ではありません)です。より速く(

SELECT basket_id, fruit_id, 
     (
     SELECT COUNT(*) 
     FROM basket_fruit bfi 
     WHERE bfi.basket_id = bf.basket_id 
       AND bfi.fruit_id <= bf.fruit_id 
     ) AS fruit_position 
FROM basket_fruit bf 
WHERE basket_id = 1 

またはセッション変数を使用しますが、文書化されておらず、将来のリリースで破損する可能性が実装の詳細に依存しています:

Schema: 
baskets:  id, title 
fruits:  id, title 
basket_fruits: id, basket_id, fruit_id 
+0

あなたは、スキーマを表示することができますか? – Starx

答えて

5

MySQLあなたはサブクエリを使用する必要がありますので、範囲内の機能をサポートしていません。 ):

SET @rn = 0; 

SELECT basket_id, fruit_id, @rn := @rn + 1 AS fruit_position 
FROM basket_fruit bf 
WHERE basket_id = 1 
ORDER BY 
     fruit_id 
1

SQLは、返される行の順序を保証していません。したがって、fruit_positionは、時々照会されると異なる可能性があります。これはおそらく、表のDMLアクティビティによって発生します。

あなたが実際にいくつかの順序付けが必要な場合は、あなたが選ぶ必要があります。

  1. 使用は
  2. (存在する場合)フルーツの名前のように、キーを注文すると、列を既存の特別なフィールドを作成し、seq_nrなどに注文を指定することあなたの果物。
2

basket_fruitsテーブルには重いと思われる列はありません。あなたは、単にそのテーブルのデータにいくつかの数字を追加したい場合は、あなたがこれを試みることができる(これは、各バスケットは独自の重み1から数えを持つことができます):

SET @current_group = NULL; 
SET @current_count = NULL; 

SELECT 
id, basket_id, fruit_id, 
CASE 
    WHEN @current_group = basket_id THEN @current_count := @current_count + 1 
    WHEN @current_group := basket_id THEN @current_count := 1 
END AS fruit_position 
FROM basket_fruits 
ORDER BY basket_id, id 

サンプル入力:

+----+-----------+----------+ 
| id | basket_id | fruit_id | 
+----+-----------+----------+ 
| 2 |   2 |  5 | 
| 6 |   2 |  1 | 
| 9 |   1 |  2 | 
| 15 |   2 |  3 | 
| 17 |   1 |  5 | 
+----+-----------+----------+ 

出力例:

+----+-----------+----------+----------------+ 
| id | basket_id | fruit_id | fruit_position | 
+----+-----------+----------+----------------+ 
| 9 |   1 |  2 |    1 | 
| 17 |   1 |  5 |    2 | 
| 2 |   2 |  5 |    1 | 
| 6 |   2 |  1 |    2 | 
| 15 |   2 |  3 |    3 | 
+----+-----------+----------+----------------+ 
+0

私はタイトルを書いている間に体重について考えていましたが、それから忘れてしまいました。試しに行く – fl00r