加入职位

时间:2012-04-24 08:29:20

标签: mysql sql database join

我有表basketsfruitsbasket_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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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 |
+----+-----------+----------+----------------+

答案 2 :(得分:1)

SQL不保证返回行的顺序。因此,fruit_position在不时查询时可能会有所不同。很可能这会由于您桌面上的DML活动而发生。

如果你真的需要一些订购,你应该选择:

  1. 使用现有列作为排序键,如水果名称(如果存在)
  2. 创建一个特殊字段,例如seq_nr,用于指定水果的排序。