2012-02-07 69 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

以何種方式它不能很好地工作? – 2012-02-07 18:35:09

+0

它只顯示一個商店,但我不明白爲什麼;也許它不同.. – Nathaniel 2012-02-07 18:38:02

回答

0

20個隨機標籤/類別GROUP BY工作,你需要應用某種形式的聚合功能,你不是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

請注意,正如書面所述,只有當每個'(name,slug)'組合都不超過一個唯一的'term_id'時,它才能正常工作。 – stevepastelan 2012-02-07 18:52:32

+1

在'MySQL'中,即使未彙總,您也可以按term_id進行分組,並選擇名稱和子彈。 – Quassnoi 2012-02-07 18:56:01

+0

感謝您的提示,Quassnoi - 更新了我的答案。 – stevepastelan 2012-02-07 19:00:53

1

,因爲你是暴露的主要問題之一與MySQL聚集,即有沒有內置的限制(這必須是MySQL的,因爲其他RDBMS甚至不它允許它不能很好地工作解析)。

,因爲你是GROUP ING通過tt.count,但不這樣做與其他領域的事情你得到隨機值t.namet.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 

此加入的條款和term_taxonomy表(與任何安裝前綴使用,例如導致wp_terms WP_)別名爲「t」和「TT」在查詢別處。

這些表格被連接在一起,使得具有相同term_id的'term'記錄和'term_taxonomy'記錄被鏈接。

結果受到限制,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 

這會給你的前100