在一个声明中,我试图通过连接到另一个表来对一个表的行进行分组。我想只获得分组结果不为空的分组行。
实施例。项目和类别
SELECT Category.id
FROM Item, Category
WHERE Category.id = Item.categoryId
GROUP BY Category.id
HAVING COUNT(Item.id) > 0
上面的查询给出了我想要的结果,但这很慢,因为它必须计算按Category.id分组的所有行。
什么是更有效的方式?
我试图通过LIMIT进行分组,每组只检索一行。但我的尝试失败了。知道我怎么能这样做吗?
由于
答案 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