有这样一张表:
| user_id | product_id | action
+---------+------------+--------
| 1 | 1 | viewed
+---------+------------+--------
| 1 | 1 | liked
+---------+------------+--------
| 1 | 1 | bought
+---------+------------+--------
| 1 | 2 | viewed
+---------+------------+--------
| 1 | 2 | bought
+---------+------------+--------
| 2 | 1 | viewed
+---------+------------+--------
| 2 | 1 | liked
+---------+------------+--------
有必要计算用户对其执行任何操作的产品数量。同时,不知道动作表中可以有哪些值。当然,这里提出了一个平庸的解决方案,例如:
SELECT user_id, COUNT(product_id)
FROM (
SELECT user_id, product_id FROM my_table GROUP BY user_id, product_id
) my_table
GROUP BY user_id
它会给我这个:
| user_id | count
+---------+-------
| 1 | 2
+---------+-------
| 2 | 1
但我不仅想获得用户和他执行任何操作的产品数量,还想获得这些产品本身。我预计:
| user_id | product_id | count
+---------+------------+-------
| 1 | 1 | 2
+---------+------------+-------
| 1 | 2 | 2
+---------+------------+-------
| 2 | 1 | 1
+---------+------------+-------
那些。换句话说,我需要获取 user_id 和 product_id 的唯一组合,并将它们与结果中此类组合的数量进行比较。如果你还是不太明白我想要什么,我也可以这样说:获取 user_id 和 product_id 的唯一组合数。对于每个这样的组合,添加给定 user_id 执行某些操作的产品数量。
它似乎提出了 2 个请求,不要担心。但问题是这张表是虚构的,而不是my_table:
SELECT ... FROM my_table
将有一个复杂的子查询,执行 2 次将占用大量资源。我的mysql版本不支持WITH .. AS。在 PL 的帮助下通过仅从数据库中选择唯一组合来计算此类组合的数量也不起作用 =)
而这个选项:
套装?
在 MySQL 5.7 版本上,只有存储过程格式的解决方案是可能的:
接着
在程序中,将结果保存在临时表中后,您已经可以随心所欲地对其进行扭曲(包括将显示的商品限制为用户等)。您还应该查看数据量 - 如果它很大,最好安全地使用它并创建一个永久而不是临时的表。