【问题标题】:how to count rows by first letter?如何按第一个字母计算行数?
【发布时间】:2012-04-14 13:17:05
【问题描述】:

这里有一个菜鸟问题!

我写了这个查询,但是“分组依据”非常愚蠢...... 那么,我该如何纠正呢?

SELECT
    COUNT(*) AS total,
    'x' as test
    FROM
contents
    WHERE name LIKE 'C%'
GROUP BY
    test
ORDER BY id ASC

欢迎使用不同的解决方案和有关表演的信息(也许使用 DISTINCT?)

提前致谢!

【问题讨论】:

  • 是的,已编辑! LIKE 是一个字母
  • 输出是什么?
  • LEFT(name,1) as letter... "È" 和 GROUP BY 这样的字母呢?我使用 utf-8 和 utf-8 和 utf8_unicode_ci 作为排序规则...我想使用 ascii 字母,那么 È 应该被认为是“e”
  • 我想要一个包含总行数的单行
  • 您不需要 group by 来计算记录。此外,聚合查询中的 order by 应该是 group by 列表或聚合函数中的列。

标签: mysql sql


【解决方案1】:

这应该与任何其他选项一样好 -

SELECT
    LEFT(name, 1) AS first_letter,
    COUNT(*) AS total
FROM contents
GROUP BY first_letter

如果您想一次针对单个字母运行此查询,您可以添加 WHERE 子句并删除 GROUP BY -

SELECT COUNT(*) AS total
FROM contents
WHERE name LIKE 'a%'

【讨论】:

  • 我想尝试删除分组,因为我已经知道字母...有没有办法在没有特定概念的情况下对所有行进行分组?
  • 就像第二个例子一样只计算(*)
  • 我喜欢你的第一个答案。它建议在 select 语句本身中提取数据,以便您可以按条件对其应用分组。
  • 我喜欢第一个答案,因为@aartist 提到的原因以及它可以帮助您进行质量检查/了解您的数据集的事实 - 您可以看到所有可能的起始字符。如果我硬编码“A”、“B”、...“Z”,我将永远不会看到以我没想到的非 alpha 字符开头的记录。
  • 如何排除以数字而不是字母开头的单词?
【解决方案2】:

让我们剖析您的查询:

SELECT
    COUNT(*) AS total,
    'x' as test     <-- Why?
    FROM            <-- Bad formatting.
contents
    WHERE name LIKE 'C%'
GROUP BY
    test            <-- Removing 'x' and the whole GROUP BY has the same effect.
ORDER BY id ASC     <-- The result only contains one row - nothing to sort.

因此,返回一行和一个字段的查询,包含name 以“C”开头的行数,如下所示:

SELECT COUNT(*)
FROM contents
WHERE name LIKE 'C%'

拥有一个前沿name的索引将确保良好的性能。要了解原因,请查看Anatomy of an SQL Index

【讨论】:

    【解决方案3】:

    应该给你一切以备不时之需

    SELECT
      COUNT(*) AS total,
      test
    FROM
     (SELECT substring(name,1,1) as test
     from contents) t
    GROUP BY test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-07
      • 2012-11-24
      • 1970-01-01
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2011-03-22
      • 2022-12-11
      相关资源
      最近更新 更多