2010-05-26 26 views
1

在一條語句中,我試圖通過連接到另一個表來對一個表的行進行分組。我只想得到分組行結果不爲空的分組行。MySQL:返回分組的字段,其中組非空,有效

Ex。項目和類別

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

上述查詢給我我想要的結果,但這是緩慢的,因爲它必須通過計算分組Category.id的所有行。

什麼是更有效的方法?

我正在試圖做一個Group By LIMIT來只檢索每組一行。但我的嘗試失敗了。任何想法我怎麼能做到這一點?

感謝

+0

做我的理解對不對,你想返回,在他們至少有一個項目的所有類別? – Quassnoi 2010-05-26 14:02:10

+0

是的,但有效。那就是問題所在。 – 2010-05-26 14:04:05

回答

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)創建索引。

+0

我很清楚選擇非空類別的各種方法。但我需要一些有效的東西。潛在的物品可能有成千上萬的行。 – 2010-05-26 13:57:09

+0

您可以添加DISTINCT關鍵字以避免項目表中的所有這些category_id重複項。 – SorcyCat 2010-05-26 13:59:01

+0

@Ryan:是什麼讓你覺得這樣會效率低下? – Quassnoi 2010-05-26 13:59:44

0

如果你不需要它,那麼如何消除分類表呢?

SELECT Item.categoryId 
FROM Item 
GROUP BY Item.categoryId 

我不確定你甚至需要HAVING子句,因爲如果某個類別中沒有項目,它將不會創建一個組。

+0

這將返回沒有類別記錄的項目。 – Quassnoi 2010-05-26 13:51:07

+0

您的原始查詢並未表明需要整個類別記錄,只是已在Item表中提供的ID。如果你這樣做,請看看Quassnoi的答案。 – SorcyCat 2010-05-26 13:53:17

+0

哦,這是必要的,這只是一個例子來證明我正在嘗試做什麼。 – 2010-05-26 14:01:04

0

我認爲這在功能上是等同的(返回每個類別至少有一個項目),並且應該快得多。

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

這看起來非常接近我正在尋找的東西。我打算使用EXISTS,但我不記得名字謝謝。如果您在內部查詢的末尾執行了「限制1」,那麼是否有助於加快速度?因爲你仍然選擇所有項目。 – 2010-05-26 13:59:51

+0

這不會選擇所有項目。一旦找到匹配項,Exists立即返回,但找不到所有匹配的行。 – Donnie 2010-05-26 14:51:03

+0

你確定嗎?我認爲LIMIT和以前一樣。但後來我讀到LIMIT只是過濾最終結果。 EXISTS如何以一個結果結束?無論如何,我會在大約一個小時內測試它。 – 2010-05-26 15:01:35

0

我想,這只是我的看法,正確的方法是計算所有的東西。也許問題出在另一個地方。

這就是我用於計數,它工作得很快,即使有大量的數據。

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

它會給你一個按類別的所有項目的散列。但它不會包含空的類別。

然後,retrieveng分類信息這樣做:

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

順便提一下,此查詢會爲您提供每個類別的確切項目數。如果你不需要這個,你可以跳過它刪除「COUNT(*)AS n」部分。 – 2010-05-26 13:58:25