【问题标题】:Sql statement query count datasql语句查询count数据
【发布时间】:2013-04-20 00:30:23
【问题描述】:

我开始学习如何编写 sql 语言,但我遇到了以下问题: 现在我在名为“数据”的表中有一个数据

+------+-------+-------+-------+-------+
| id   | name  | type1 | type2 | type3 |
+------+-------+-------+-------+-------+
|    1 | Cake  | a     | b     | f     |
|    2 | Coca  | a     | d     | c     |
|    3 | Ice   | c     | b     | a     |
|    4 | Wine  | c     | e     | d     |
|    5 | Salad | c     | f     | a     |
|    6 | Water | d     | e     | f     |
+------+-------+-------+-------+-------+

我想写一个sql语句来统计type1、type2、type3中出现的所有类型 所以我想要得到的结果是

+------+------+
| type | count|
+------+------+
|    a | 4    |
|    b | 2    |
|    c | 4    |
|    d | 3    |
|    e | 2    |
|    f | 3    |
+------+------+

假设我们不知道有多少不同的类型和列数,那么您能指导我如何处理这个问题吗?哦,我应该用级别编程语言而不是 sql 来解决它吗?我在 Symfony2 上使用 php。

提前致谢,

【问题讨论】:

  • 看起来你的第一个表有三种类型存储相同类型的数据..这不是一个好的数据库实践...阅读规范化..for start check this stackoverflow.com/questions/1258743/normalization-in-mysql
  • 详细阐述 Dinesh 评论:我想说你必须创建一个表“类型”,然后创建从“数据”表到“类型”表的键。正如 Dinesh 所说 - 在多个地方存储相同的数据并不是一个好习惯(但有时它实际上是优化速度所必需的)
  • 既然你说你在努力学习,我就听说过《为普通人设计的数据库》和《10 分钟内自学 SQL》这本书的好东西。

标签: php mysql sql


【解决方案1】:
SELECT  type, COUNT(*) count
FROM    
    (
        SELECT  type1 type FROM data
        UNION ALL
        SELECT  type2 type FROM data
        UNION ALL
        SELECT  type3 type FROM Data
    ) AS subquery
GROUP   BY type

输出

╔══════╦═══════╗
║ TYPE ║ COUNT ║
╠══════╬═══════╣
║ a    ║     4 ║
║ b    ║     2 ║
║ c    ║     4 ║
║ d    ║     3 ║
║ e    ║     2 ║
║ f    ║     3 ║
╚══════╩═══════╝

【讨论】:

  • 从像你这样的人身上学到很多东西。顺便说一句,这一行中“类型”的含义是什么:- SELECT type1 type FROM data 。是别名吗?
【解决方案2】:

一种只需要扫描一次数据表的方法:

select type, count(*) from
(select case t.typeno
            when 1 then d.type1
            when 2 then d.type2
            when 3 then d.type3
        end type
 from (select 1 typeno union all select 2 typeno union all select 3 typeno) t
 cross join data d
) sq
group by type

【讨论】:

  • 我对比了你和@JW的执行计划,发现你的执行计划比他多sqlfiddle.com/#!2/bbf1f1/5
  • @SkinnyPipes:是的 - 只有其中一个访问表(与 JW 的执行计划中的三个相比)。除非实际的数据表非常大,否则这两种方式都不会产生太大的影响(但如果它是一个大表,我希望这个查询能更好地执行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-06
  • 1970-01-01
  • 2016-11-29
相关资源
最近更新 更多