mysql - SQL查询: rows for user with multiple items until first occurence of value based on order for each item

标签 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(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/

相关文章:

c# - 列 [X] 不属于表服务器错误 - 为什么?

php - 使用 Acrobat Javascript 为 PDF 分配唯一的契约(Contract)编号

php - json_encode 数组中的自定义键

mysql - 模块化应用程序的数据库表命名约定

php - 在 PHP 中排序时 Mysql 字段值被截断

mysql - 相同的 MySQL 查询但不同的输出 - 为什么?

php - 类型(mysql 链接)的资源(4) 注意 : Object of class stdClass could not be converted to int

php - PDO 功能错误

mysql - JDBC MySQL连接-读取通讯包错误

mysql - 通过外键从联结表检索数据 - Laravel