2009-12-04 37 views
0

我想結合幾個SQL查詢來減少執行的查詢數量並希望同時提高性能。結合SQL查詢簡化和性能增益

我有很多產品,分爲幾類。一些產品有爲他們寫的文章(大多數不會)。此刻,我獲取所有產品類別有點像這樣...

// * used here to keep things simple 
SELECT * FROM products WHERE iCategory=23; 

然後,在結果列表中的每個產品我做這樣的額外查詢...

SELECT COUNT(*) FROM articlelinks WHERE iProduct=xxx; 

如果產品有一個或多個物品,我可以在旁邊放一個小圖標。

我可以將這些結合到一個查詢中,該查詢將爲每個產品計數,包括計數爲零的產品。我所有的嘗試都會產生一個列表,其中只包含帶有文章的產品。

我正在使用MySql和PHP。

回答

1

可以使用 (scalar) subquery得到計數每一個「組」。

SELECT 
    *, 
    (
    SELECT 
     COUNT(*) 
    FROM 
     articlelinks 
    WHERE 
     articlelinks.iProduct=products.iProduct 
) as c 
FROM 
    products 
WHERE 
    iCategory=23 
+0

我在這裏有幾個正確的答案,所以謝謝大家。我接受這個解決方案,因爲這個解決方案更容易適用於現有的代碼,儘管其他解決方案也一樣正確。 –

+0

(一如既往)最好用'EXPLAIN SELECT ....'檢查查詢,看看你是否有適合這個查詢的索引。 http://dev.mysql.com/doc/refman/5.0/en/using-explain.html – VolkerK

3

你可以嘗試這樣的事情

SELECT iProduct, COUNT(articlelinks.iArticle) 
FROM products LEFT JOIN 
    articlelinks ON products.iProduct = articlelinks.iProduct 
WHERE iCategory=23 
GROUP BY iProduct 
+0

我似乎在'COUNT得到一個錯誤(articlelinks。*)'查詢的一部分。 –

+0

再看一遍,我將它改爲articlelink.iArticle,文章鏈接表中的編號爲 –

+0

是的,這解決了問題併產生了正確的結果。 –

1

你可以使用select語句是這樣的:

Select iProduct, 
[other cols],  
(select count(*) from articlelinks where iProduct = products.iProduct) as articles 
from products 
WHERE iCategory=23; 

這應該總是給你的文章數量,哪怕是零