查询以计算一个表中的行和更多特定行

时间:2015-01-08 13:36:24

标签: mysql

我试图编写一个查询,告诉我用户购买产品的次数,以及产品购买的次数。

我搜索的表格中有

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添加到查询中的任何位置即可。

提前致谢!

2 个答案:

答案 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