2

私はテーブルを持っていますbasketsfruitsそしてbasket_fruits(join-table:) basket_id-fruit_id

バスケット内の各果物の位置を返すにはどうすればよいですか?

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

フルーツの位置は、返された結合テーブルの行の数です(列ではありません)。

Schema:
baskets:       id, title
fruits:        id, title
basket_fruits: id, basket_id, fruit_id
4

3 に答える 3

5

MySQLレンジング関数をサポートしていないため、サブクエリを使用する必要があります。

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

またはセッション変数を使用します(より高速ですが、文書化されておらず、将来のリリースで機能しなくなる可能性のある実装の詳細に依存します):

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
于 2012-04-24T08:36:08.653 に答える
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 |
+----+-----------+----------+----------------+
于 2012-04-24T09:08:39.810 に答える
1

SQLは、返される行の順序を保証しません。したがってfruit_position、時々照会されると異なる可能性があります。ほとんどの場合、これはテーブルのDMLアクティビティが原因で発生します。

本当に注文が必要な場合は、次を選択する必要があります。

  1. 果物の名前(存在する場合)のように、既存の列を順序付けキーとして使用します
  2. seq_nr果物の順序を指定するような特別なフィールドを作成します。
于 2012-04-24T08:37:23.067 に答える