我试图编写一个查询,告诉我用户购买产品的次数,以及产品购买的次数。
我搜索的表格中有
列log_id (int)
log_product (int)
log_date (datetime)
log_user (int)
今天,我正在使用此代码
SELECT product_id
, product_name
, brand_name
, COUNT(log_user) nbuys
FROM Products p
JOIN Brands b
ON p.product_id = b.brands_id
LEFT
JOIN log l
ON l.log_product = p.product_id
GROUP
BY p.product_id
回报是这样的:
| product_id | product_name | brand_name | nbuys |
其中nbuys是所有用户购买产品的次数。我想要的是一种重写该查询的方法,以便它返回类似于:
的内容| product_id | product_name | brand_name | nbuys | n_userbuys |
新列' n_userbuys'是看到该页面的用户购买该列的次数。因此,user_id信息将放在查询中。最终结果是可以看到所有产品的列表。
我希望这很清楚。
我将表格产品和品牌的结构添加到问题中。
产品
| product_id (int) | product_name (varchar) | product_brand (int) |
品牌
| brand_id (int) | brand_name (varchar) |
我想我不清楚我在寻找什么。表log
只是将其他表中的一些键放在一起。我试图写的查询应该创建一个列表。在该清单上,所有产品都应出现。在每一行上,必须显示购买产品的次数。 COUNT(log_user) ... GROUP BY p.product_id
完成了这项工作。缺少的部分是每一行还必须显示给定用户购买它的次数。
这意味着如果user_id = 7的用户正在查看该页面,则通过查询生成的列表应显示如下内容:
| product_id | product_name | brand_name | nbuys | n_userbuys |
| 1 | pencil | Faber | 120 | 12 |
| 2 | pen | Bic | 531 | 34 |
| 3 | rubber | Faber | 60 | 4 |
但是如果另一个用户(user_id = 8)正在查看该页面,那么该列表应该保留列nbuys上的值,但是将列n_userbuys上的值更改为user_id = 8购买它们的次数:
| product_id | product_name | brand_name | nbuys | n_userbuys |
| 1 | pencil | Faber | 120 | 1 |
| 2 | pen | Bic | 531 | 23 |
| 3 | rubber | Faber | 60 | 1 |
代码在php上运行,因此我只需将用户ID添加到查询中的任何位置即可。
提前致谢!
答案 0 :(得分:1)
我几乎找到了问题的答案:
SELECT product_id, product_name, brand_name, COUNT(log_user) AS nlog,
COUNT(CASE WHEN log_user='$user_id' THEN 1 END) as ulog FROM Products
INNER JOIN Brands ON Products.product_brand=Brands.brand_id
LEFT JOIN log on log.log_product = Product.product_id
GROUP BY product_id,product_name, Brands_name
使用COUNT(CASE WHEN log_user='$user_id' THEN 1 END)
可以让我计算具有该特定条件的行存在的次数。但是,代码是按每个用户购买商品的时间重复行。
解决。修复只是GROUP BY product_id。谢谢大家。
答案 1 :(得分:0)
根据问题详细信息及其下的评论,您只需将LOG_USER
添加到选择标记中,您还必须更正group by
子句
SELECT product_id, product_name, brand_name,
COUNT(log_buys) AS nbuys, LOG_USER AS n_userbuys FROM Products INNER
JOIN Brands ON Products.product_brand=Brands.brands_id LEFT JOIN
log on log.log_product = Products.product_id
GROUP BY product_id,product_name, brand_name,LOG_USER