2012-02-07 3 views
3

누군가이 SQL 쿼리를 설명해 주시겠습니까? 이것은 인기있는 상점을 보여 주지만 잘 작동하지 않습니다.이 짧은 SQL 쿼리를 설명합니다

sql = "SELECT t.name, t.slug, tt.count 
FROM ".$wpdb->prefix."terms AS t INNER JOIN ".$wpdb->prefix."term_taxonomy AS tt ON t.term_id = tt.term_id 
WHERE 
    tt.taxonomy IN ('$tax_name') 
    AND tt.count > 0 
GROUP BY tt.count DESC 
ORDER BY RAND() LIMIT $the_limit"; 
+2

어떤면에서는 잘 작동하지 않습니다

나는 당신이 원하는 것은 각 점포의 총 수입니다 같은데요? –

+0

하나의 가게 만 표시되지만 그 이유는 알 수 없습니다. 어쩌면 다른 것으로 계산할 수 있습니다. – Nathaniel

답변

0

20 임의 태그/범주를 줄 것이다, 당신은 집계의 어떤 종류를 적용해야 기능이 아닌 모든 기능을 GROUP ing BY.

sql = "SELECT t.name, t.slug, sum(tt.count) as count 
FROM ".$wpdb->prefix."terms AS t 

INNER JOIN ".$wpdb->prefix."term_taxonomy AS tt 
ON t.term_id = tt.term_id 

WHERE tt.taxonomy IN ('$tax_name') 
GROUP BY tt.term_id 
HAVING count > 0"; 
+0

작성된 것처럼 각'(이름, 슬러그) 조합에 고유 한'term_id '가 두 개 이상없는 경우에만 올바르게 작동합니다. – stevepastelan

+1

'MySQL'에서'term_id'로 그룹화하고 집계되지 않더라도'name'과'slug'를 선택할 수 있습니다. – Quassnoi

+0

팁 주셔서 감사합니다, Quassnoi - 내 대답을 업데이 트했습니다. – stevepastelan

1
당신이 내장 제한 (이 다른 RDBMS도 그것을 허용하지 않기 때문에 MySQL이 있어야한다이없는, 즉 것으로, MySQL의 집계와 주요 문제 중 하나가 노출되어 있기 때문에 그것은 잘 작동하지 않습니다

구문 분석).

당신이 tt.count에 의해 GROUP 보내고 있지만 그 다른 필드 아무것도 안하고 있기 때문에 당신은 임의 값 t.name에 대한t.slug을 얻고있다.

이 문제를 해결하는 방법에 대한 조언을 보려면 몇 가지 샘플 데이터와 원하는 결과를 공유해야합니다.

1

귀하의 질문은 매우 모호하므로 질문에 대한 답변을 드리겠습니다. 어쩌면 무엇이 문제인지 알지 못하기 때문에 무언가가 당신의 솔루션이 무엇인지 알려줄 것입니다.

SELECT 
    t.name, t.slug, tt.count 
FROM ".$wpdb->prefix."terms AS t 
INNER JOIN ".$wpdb->prefix."term_taxonomy AS tt 
    ON t.term_id = tt.term_id 
WHERE 
    tt.taxonomy IN ('$tax_name') 
    AND tt.count > 0 
GROUP BY 
    tt.count DESC 
ORDER BY RAND() 
LIMIT $the_limit 

이 (예 wp_terms 결과 wp_으로, 사용 된 접두사를 설치 무엇 이건) 't'와 다른 쿼리에 'TT'로 별명 계약 term_taxonomy 테이블을 조인.

'term'레코드와 'term_taxonomy'레코드가 동일한 term_id와 연결된 테이블이 조인됩니다.

결과는 term_taxonomy.taxonomy 필드가 $ tax_name 변수에 전달 된 값 중 하나가되도록 제한됩니다.

그런 다음 결과는 동일한 term_taxonomy.count를 갖는 행이 함께 축소되고 임의로 정렬되며 첫 번째 $ the_limit 항목 만 반환되도록 압축됩니다.

1

난 당신이 뭔가 할 생각 :

SELECT * 
FROM (
     SELECT t.name, t.slug, SUM(tt.count) AS cnt 
     FROM terms t 
     JOIN term_taxonomy tt 
     ON  tt.term_id = t.term_id 
     WHERE tt.taxonomy IN ($tax_name) 
       AND tt.count > 0 
     GROUP BY 
       t.term_id 
     ORDER BY 
       cnt DESC 
     LIMIT 100 
     ) q 
ORDER BY 
     RAND() 
LIMIT 20 

이 작동하도록 GROUP BY를 들어 당신에게 최고 100

관련 문제