如何计算SQL中具有唯一列和行的事件?

时间:2016-04-14 19:16:40

标签: mysql performance

这个问题非常类似于:https://stackoverflow.com/posts/1503959/edit 但我想更进一步,为每个年龄创建新的列,并计算该年龄。

我有一张人的表:

name  | age
--------
bill  | 25
tom   | 25
tom   | 23
tom   | 23

我想查询所有名称,以及计算年龄相同的名称的其他列:

name  | 23 | 25
----------------
bill  | 0  | 1
tom   | 2  | 1

最有效的方法是什么? 我担心子查询会很慢,我想知道是否有更好的方法。有吗?

2 个答案:

答案 0 :(得分:1)

如果您有许多年龄值,动态数据透视非常有用

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'max(case when age = ''',
      age,
      ''' then 1 else 0 end) AS ','`',
      age,'`'
    ) ORDER BY age
  ) INTO @sql
FROM
  t;

SET @sql = CONCAT('SELECT name, ', @sql, ' 
                  FROM t 
                   GROUP BY name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

FIDDLE

答案 1 :(得分:0)

在SQL中如何执行此操作的最简单方法是使用GROUP BY

SELECT name, age, COUNT(*) AS occurence FROM table GROUP BY name, age

但是你得到的格式不同。你需要在PHP中重新格式化它们,因为SQL并不是你想要的工作方式。