我有一个MySQL查询是这样的:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;

我想限制的结果,行,其中出现次数> 0。这在我看来很简单,但我似乎无法使它工作。不管我怎么努力,哪来或HAVINGs,每当我尝试添加这个限制,我得到没有行的回报。我敢肯定,有我的表中的数据应该返回。有谁知道如何完成我在做什么?


我试过这个,但它仍然无法正常工作。任何想法,为什么它仍然不会工作?

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" HAVING SUM(...some SQL removed for brevety)>0 GROUP BY q.P_id ORDER BY Occurrences DESC LIMIT 10;
有帮助吗?

解决方案

我不熟悉的MySQL,因为我与SQL Server,但在T-SQL,你不能在GROUP使用别名BY子句(我本来以为ORDER BY子句为好,但此后已证明是不正确的)。在这种情况下,你要根据GROUP BY的结果进行过滤,所以我会按如下方式使用HAVING子句:

SELECT *, SUM(... some SQL removed for brevity ...) AS Occurrences
FROM
    some_table AS q
WHERE
    criterion = 'value'
GROUP BY
    q.P_id
HAVING
    SUM(... some SQL removed for brevity ...) > 0
ORDER BY
    Occurrences DESC
LIMIT 10;

其他提示

该查询的工作对我来说...

select order_id, sum(qty_ordered) as total_qty 
from sales_flat_order_item 
group by order_id 
having total_qty > 10
order by total_qty desc

嗯,我发现这个地方吧。

该语句是现在:

SELECT *, SUM(...some SQL removed for brevety) AS Occurrences FROM some_table AS q
WHERE criterion="value" GROUP BY q.P_id HAVING SUM(...some SQL removed for brevety)>0 ORDER BY Occurrences DESC LIMIT 10;

这似乎是工作正常与ORDER BY出现次数,

相信聚集体应该是HAVING子句。虽然,不可否认,我不知道如果别名被接受。

HAVING (Occurrences > 0)

HAVING (SUM(...some SQL removed for brevety) > 0)

可替换地,可以使用一个子查询:

SELECT *
FROM (
   -- your current query
) AS sub
WHERE (Occurences > 0)

根据该SQL标准,列别名不是在查询,这是一个可恶的东西的主体可用。鉴于你已经尝试过,这听起来好像是一样的MySQL(和其他一些DBMS)也是如此。你可能有重复的顺序表达BY子句。

另外,GROUP BY子句应列出每列,它是在*,不仅仅是主键(虽然,在逻辑上,指定的主键应该是足够的)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top