我有具有以下格式的表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 |
答案 0 :(得分:0)
以下方法应该适用于所有情况,包括当某个产品被不喜欢然后最终又被喜欢的情况。
在Derived table中,我们可以获得每个id
和user_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 |