SQL查询:具有多个项目的用户的行,直到第一次出现的值为基于每个项目的顺序

时间:2015-08-06 15:42:52

标签: mysql

包含必要数据的表格如下所示:

+-----+----------+----------+-----------+----------+
| 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    |
+-----+----------+----------+-----------+----------+

1 个答案:

答案 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