【问题标题】:select count(*) with left join用左连接选择计数(*)
【发布时间】:2013-11-28 10:13:40
【问题描述】:

我有一个查询,我尝试检索行数,但在我的情况下,每次都作为结果 1 下降。我想这是一个连接问题,我不知道如何处理这个

SELECT 
  COUNT(*) AS summe 
FROM
  feeds 
  LEFT JOIN cat_product cp 
    ON cp.product_id = feeds.productid 
WHERE 1 = 1 
  AND cp.price BETWEEN 950 
  AND 1450 
  AND cp.ram_cap BETWEEN 5 
  AND 11 
  AND feeds.tdcategoryname LIKE '%Laptop%' 
  AND feeds.brand IN ('Dell', 'Lenovo', 'Acer', 'Asus') 
GROUP BY cp.product_id 

【问题讨论】:

  • WHERE 1 = 1 是干什么用的? COUNT(feeds.*)COUNT(cp.*) ?
  • 我使用 php 进行动态查询,其中 1=1 是为了避免流程复杂化
  • 我们也总是使用 PHP 进行动态查询。但是我们从不使用WHERE 1=1 这不会影响结果。
  • 问题是你要数什么?如果您只想计算符合条件的行,请忽略分组...
  • 由于WHERE 子句中的条件,您的LEFT JOIN 实际上是INNER JOIN。如果您尝试返回 feeds 中的所有行,无论是否存在 cat_product 行(即,获取 0 计数),您将需要将 cp. 条件向上移动到连接中.此外,您的下一个/上一个范围从哪里开始?请记住,BETWEEN 等于 cp.price >= 950 AND cp.price <= 1450,因此如果下一个范围从 1450 开始,并且有一行具有该值,它将被包含两次。出于这个和其他原因,请改为使用独占上限 (<)。

标签: mysql sql select count


【解决方案1】:

试试这个,不确定您使用的是MySQL 还是MSSQL。由于您LEFT JOIN,因此值可能是NULL。在MSSQL 中,如果考虑了NULL 值,则结果将是NULL 总是在使用像COUNT 这样的聚合函数时。

对于 MySQL

SELECT 
  COUNT(IFNULL(cp.Procuct_id,0)) AS summe 
FROM
  feeds 
  LEFT JOIN cat_product cp 
    ON cp.product_id = feeds.productid 
WHERE 1 = 1 
  AND cp.price BETWEEN 950 
  AND 1450 
  AND cp.ram_cap BETWEEN 5 
  AND 11 
  AND feeds.tdcategoryname LIKE '%Laptop%' 
  AND feeds.brand IN ('Dell', 'Lenovo', 'Acer', 'Asus') 

【讨论】:

  • 感谢我尝试了 mysql 版本,但结果相同
  • 要计算cp.Product_Id吗?
  • 是的,我想计算 cp.product_id,按照@Jan Zeiseweis 的建议删除 GROUP BY,而不是这样
  • 哇,我还没醒,是的,不需要 GROUP BY,因为它只是计数而不是其他列的计数....
猜你喜欢
  • 2020-12-07
  • 2023-03-21
  • 1970-01-01
  • 2020-05-05
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多