2

我有表basketsfruitsbasket_fruits(连接表:)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 回答