MySQL:有效地返回组不空的分组字段

时间:2010-05-26 13:44:13

标签: mysql performance limit group-by

在一个声明中,我试图通过连接到另一个表来对一个表的行进行分组。我想只获得分组结果不为空的分组行。

实施例。项目和类别

SELECT Category.id
FROM Item, Category
WHERE Category.id = Item.categoryId
GROUP BY Category.id
HAVING COUNT(Item.id) > 0

上面的查询给出了我想要的结果,但这很慢,因为它必须计算按Category.id分组的所有行。

什么是更有效的方式?

我试图通过LIMIT进行分组,每组只检索一行。但我的尝试失败了。知道我怎么能这样做吗?

由于

4 个答案:

答案 0 :(得分:0)

试试这个:

SELECT  item.categoryid
FROM    Item
JOIN    Category
ON      Category.id = Item.categoryId
GROUP BY
        item.categoryid
HAVING  COUNT(*) > 0

这与您的原始查询类似,但不会执行您想要的操作。

如果要选择非空类别,请执行以下操作:

SELECT  category.id
FROM    category
WHERE   id IN
        (
        SELECT  category_id
        FROM    item
        )

要使其快速运作,请在item (category_id)上创建索引。

答案 1 :(得分:0)

如果您不需要,可以删除Category表吗?

SELECT Item.categoryId 
FROM Item
GROUP BY Item.categoryId

我不确定你甚至需要HAVING子句,因为如果一个类别中没有项目,它就不会创建一个组。

答案 2 :(得分:0)

我认为这在功能上是等效的(返回每个至少有一个项目的类别),并且应该更快。

SELECT 
  c.id
FROM 
  Category c
WHERE
  EXISTS (
    select 1 from Item i where i.categoryid = c.categoryID
  )

答案 3 :(得分:0)

我认为,这只是我的观点,正确的方法是计算所有的东西。也许问题出在另一个地方。

这就是我用来计算的东西,它的工作速度非常快,即使有很多数据也是如此。

SELECT categoryid, COUNT(*) FROM Item GROUP By categoryid

它会按类别为您提供所有项目的哈希值。但它不包括空类别。

然后,对于检索类别信息,请执行以下操作:

SELECT category.* FROM category
INNER JOIN (SELECT categoryid, COUNT(*) AS n FROM Item GROUP By categoryid) AS item
ON category.id = item.categoryid