获取条件为最后分组行的行

时间:2018-11-21 14:41:24

标签: mysql sql group-by

我有具有以下格式的表favourite_products。我需要计算有多少人(account_id)喜欢id = 12的产品。但是条件是该人上次将产品标记为喜欢。

在此示例中,id = 1的用户第一次将产品12标记为正,但随后将其标记为非正,因此不应返回该值。以下示例应返回2行(对于user_id = 5和user_id = 8)。我听说过窗口功能,但是版本5.7中有mysql,因此无法升级。您对如何编写此查询有一些想法吗?

| id |  user_id | product_id | positive |
| 1  |     1    |    12      |    1     |
| 2  |     1    |    12      |    0     |
| 3  |     1    |    15      |    1     |
| 4  |     5    |    12      |    1     |
| 5  |     5    |    12      |    1     |
| 6  |    11    |    18      |    1     |
| 7  |     8    |    12      |    1     |
| 8  |     8    |    12      |    1     |

1 个答案:

答案 0 :(得分:0)

以下方法应该适用于所有情况,包括当某个产品被不喜欢然后最终又被喜欢的情况。

Derived table中,我们可以获得每个iduser_id的最大product_id = 12值。该结果集将适当地连接到主表。这将为我们获取完整的行(用户对产品进行的近期活动)。

现在,我们只能考虑上一个活动为正的那些用户。


查询

SELECT fp.user_id
FROM   favourite_products AS fp
       JOIN (SELECT user_id,
                    Max(id) AS max_id
             FROM   favourite_products
             WHERE  product_id = 12
             GROUP  BY user_id) AS dt
         ON dt.user_id = fp.user_id
            AND dt.max_id = fp.id
            AND fp.positive = 1;

结果

| user_id |
| ------- |
| 5       |
| 8       |

View on DB Fiddle