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