我有表baskets
,fruits
和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
答案 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活动而发生。
如果你真的需要一些订购,你应该选择:
seq_nr
,用于指定水果的排序。