包含必要数据的表格如下所示:
+-----+----------+----------+-----------+----------+
| id | user_id | item_id | position | complete |
+-----+----------+----------+-----------+----------+
| 1 | 10 | 100 | 0 | true |
| 2 | 20 | 100 | 1 | false |
| 3 | 30 | 100 | 2 | false |
| 4 | 20 | 200 | 0 | true |
| 5 | 10 | 200 | 1 | true |
| 6 | 40 | 200 | 2 | false |
| 7 | 30 | 200 | 3 | false |
| 8 | 50 | 200 | 4 | false |
+-----+----------+----------+-----------+----------+
SQL小提琴数据:http://sqlfiddle.com/#!9/64903
我正在努力让用户30
保留其位置编号和位置编号,直到第一次出现complete = true
(对于项目的最高位置为真)。
每个项目都可以表示为按位置排序的预订链,我想要在last complete = true和我的用户之间得到结果。
结果集应如下所示。
+-----+----------+----------+-----------+----------+
| id | user_id | item_id | position | complete |
+-----+----------+----------+-----------+----------+
| 1 | 10 | 100 | 0 | true |
| 2 | 20 | 100 | 1 | false |
| 3 | 30 | 100 | 2 | false |
| 5 | 10 | 200 | 1 | true |
| 6 | 40 | 200 | 2 | false |
| 7 | 30 | 200 | 3 | false |
+-----+----------+----------+-----------+----------+
答案 0 :(得分:0)
因此,您正在寻找属于以下范围的行:
Range start Range end
+----+---------+---------+----------+----------+ +----+---------+---------+----------+----------+
| id | user_id | item_id | position | complete | | id | user_id | item_id | position | complete |
+----+---------+---------+----------+----------+ +----+---------+---------+----------+----------+
| 1 | 10 | 100 | 0 | 1 | | 3 | 30 | 100 | 2 | 0 |
| 5 | 10 | 200 | 1 | 1 | | 7 | 30 | 200 | 3 | 0 |
+----+---------+---------+----------+----------+ +----+---------+---------+----------+----------+
E.g:
SELECT c.*
FROM reservations a
JOIN
( SELECT x.*
FROM reservations x
JOIN
( SELECT item_id
, MAX(position) max_pos
FROM reservations
WHERE complete = 1
GROUP
BY item_id
) y
ON y.item_id = x.item_id
AND y.max_pos = x.position
) b
ON b.item_id = a.item_id
AND b.position < a.position
JOIN reservations c
ON c.id BETWEEN b.id AND a.id
WHERE a.user_id = 30;
a = range end
b = range start
c = rows with ids between those values