解释这个简短的SQL查询

时间:2012-02-07 18:32:11

标签: 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";

4 个答案:

答案 0 :(得分:1)

它不能很好地工作,因为你暴露了MySQL聚合的一个主要问题,即没有内置限制(这必须是MySQL,因为其他RDBMS甚至不允许它解析)。 / p>

您正在为t.namet.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";