【问题标题】:SQL query: count for all the reviews that each customer has writtenSQL查询:计算每个客户写的所有评论
【发布时间】:2010-11-06 06:31:04
【问题描述】:

假设我有一张名为“REVIEWS”的表格

此表包含客户为各种产品撰写的评论。

我希望能够对每个客户撰写的所有评论进行“计数”, 所以我写:

SELECT count(*) AS counter
FROM reviews 
WHERE customers_id = 12345

现在,我的问题是我希望有一个像上面这样的计数,但只针对写过特定产品评论的客户

例如,

SELECT customers_review
FROM reviews
WHERE
products_id = '170' 

总而言之,我希望能够获得他们撰写的每条评论的客户总数,但仅限于为特定产品撰写评论的客户。

【问题讨论】:

  • 谢谢大家帮助我,你们摇滚!
  • @Sebastian,既然您已经回答了您的问题,也许您可​​以将您的主题行编辑为更具体的内容?我不想想到这里有多少问题有相同的主题。

标签: sql


【解决方案1】:
select customers_id, count(*)
from reviews
where customers_id in 
(select customers_id from reviews where products_id = '170')
group by customers_id;

【讨论】:

  • exists 会比 in 快
  • Carl,感谢您的建议,但作为旁注,您向我建议的这个查询(以及 EXISTS 变体)在我的 MYSQL 网站上查询需要相当长的时间 8 - 14 秒,您认为有没有可能对此进行优化以使其更快?谢谢...
  • 塞巴斯蒂安,如果评论在customers_id 上有索引,我认为这是最快的;我不认为 IN 与 EXISTS 可能会有所作为。如果评论没有索引,当然,添加一个。
【解决方案2】:
SELECT customers_id, COUNT(*) AS counter
FROM reviews 
WHERE customers_id IN(
SELECT customers_id
FROM reviews
WHERE
products_id = '170'
)
GROUP BY customers_id

这将吸引任何写过产品 X 的客户,然后统计他们发布的评论总数。

【讨论】:

  • 该死的27秒差,这几乎是一字不差!哈哈
【解决方案3】:
Select customer_ID, Count(*)
FROM reviews
WHERE customer_ID in ( Select Customer_ID from reviews where products_id = '170')
Group By customer_ID

这应该会为您提供所有 CustomerID 的列表以及他们所有评论的计数,但它将仅限于对产品 170 发表评论的客户。

【讨论】:

  • Ian:我投了两个相同但比我快的答案:P
【解决方案4】:

只需添加到您的第一个查询的末尾

WHERE EXISTS (
SELECT 1 FROM reviews AS r 
WHERE r.customers_id = reviews.customers_id 
    AND product_id = '170')
GROUP BY reviews.customers_id

【讨论】:

    【解决方案5】:

    不同意这个线程中的方法。但我认为窗口/分析 SQL 提供了另一种看待这个问题的方法。你可以得到计数:

    • 客户对此的评论计数 详细信息行
    • 评论计数 此详细信息行中的产品
    • 计数 此客户对此的评论 此详细信息行中的产品
    • 任何 详细信息(评论的文本, 审核 ID 等...)

    SQL 语句

    SELECT
     revid, 
     CUSTID, 
     PRODID,
     COUNT (*) OVER (PARTITION BY custid) ByCust,
     COUNT (*) OVER (PARTITION BY prodid) ByProd,
     COUNT (*) OVER (PARTITION BY prodid, custid) ByCustProd
    
    FROM customer_reviews
    ORDER BY custid, prodid
    

    --输出--

    1520  106  1900 16  604 3
    4650  106  1900 16  604 3
    2730  106  1900 16  604 3
    4640  106  3900 16  254 1
    6287  110  1900 28  604 2
    5849  110  1900 28  604 2
    5965  110  3900 28  254 2
    6117  110  3900 28  254 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 2011-12-29
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多