有人可以解释一下这个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";
答案 0 :(得分:1)
它不能很好地工作,因为你暴露了MySQL聚合的一个主要问题,即没有内置限制(这必须是MySQL,因为其他RDBMS甚至不允许它解析)。 / p>
您正在为t.name
和t.slug
获取随机值,因为您GROUP
tt.count
但未对其他字段执行任何操作
有关如何解决此问题的建议,您需要共享一些示例数据和所需的输出。
答案 1 :(得分: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和term_taxonomy表(使用了所使用的任何安装前缀,例如wp_导致wp_terms),在查询的其他地方别名为't'和'tt'。
这些表的连接使得'term'记录和'term_taxonomy'记录具有相同的term_id被链接。
结果有限,因此term_taxonomy.taxonomy字段是$ tax_name变量中传递的值之一。
然后压缩结果,使具有相同term_taxonomy.count的行折叠在一起,随机排序,并且只返回第一个$ the_limit条目。
答案 2 :(得分: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名的20个随机标签/类别。
答案 3 :(得分:0)
要使GROUP BY
生效,您需要将某种聚合功能应用于您不是GROUP
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";