包含必要数据的表格如下所示:
+-----+----------+----------+-----------+----------+
| 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
(true,项目的最高位置)。
每个项目都可以表示为按位置排序的预订链,我想要最后一个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 |
+-----+----------+----------+-----------+----------+
最佳答案
因此,您要查找属于以下范围的行:
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 |
+----+---------+---------+----------+----------+ +----+---------+---------+----------+----------+
例如:
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
关于mysql - SQL查询: rows for user with multiple items until first occurence of value based on order for each item,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31860151/