2009-12-04 3 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

뭔가를 시도 할 수 있습니다.

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

당신은 당신은 각 "그룹"의 수를 얻을 수있는 (scalar) subquery를 사용하여이

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

다시 보겠습니다. 기사 링크 테이블의 ID 인 articlelink.iArticle으로 변경했습니다. –

+0

예, 문제가 해결되어 올바른 결과가 산출됩니다. –

1

는이 같은 SELECT 문을 사용할 수 있습니다

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

이 항상 당신에게 기사 수를 제공해야합니다, 제로