【问题标题】:Mysql query to pull data in the form of matrixMysql查询以矩阵形式拉取数据
【发布时间】:2013-08-06 13:04:36
【问题描述】:

我在数据库中有三列 id、topic 和 subtopic 的数据。像这样的,

CREATE TABLE Table2 (`id` int, `topic` varchar(5), `subtopic` varchar(6));
INSERT INTO Table2 (`id`, `topic`, `subtopic`) VALUES
    (1, 'place', 'paris'),
    (1, 'group', 'A'),
    (1, 'group', 'B'),
    (2, 'place', 'us'),
    (2, 'group', 'C'),
    (3, 'group', 'A'),
    (3, 'water', 'salt'),
    (4, 'water', 'sweet'),
    (4, 'world', 'ep'),
    (5, 'place', 'venus'),
    (5, 'place', 'paris'),
    (5, 'group', 'A');

我想从主题中输出结果矩阵位置 vs 组。像这样的。

    Paris|US|Venus
A   2    |0 | 1
B   1    |0 | 0
C   0    |1 | 0

想法是在副主题列中获取“组”(A,B,C)和“地点”(巴黎,美国,金星)的所有值。然后找到具有这种条件的共现数。

知道如何在 MySql 中解决吗?

【问题讨论】:

    标签: mysql matrix pivot-table


    【解决方案1】:

    您需要在您的表上加入两次以获得groupplaces,然后您可以使用带有 CASE 表达式的聚合函数将行转换为列:

    select g.subtopic as `group`,
      sum(case when p.subtopic = 'Paris' then 1 else 0 end) Paris,
      sum(case when p.subtopic = 'US' then 1 else 0 end) US,
      sum(case when p.subtopic = 'Venus' then 1 else 0 end) Venus
    from table2 g
    left join table2 p
      on g.id = p.id
      and p.topic = 'place'
    where g.topic = 'group'
    group by g.subtopic;
    

    SQL Fiddle with Demo

    如果subtopic 的值未知,则可以使用准备好的语句和动态 SQL:

    SET @sql = NULL;
    SELECT
      GROUP_CONCAT(DISTINCT
        CONCAT(
          'sum(case when p.subtopic = ''',
          subtopic,
          ''' then 1 else 0 end) as `', 
          subtopic, '`')
      ) INTO @sql
    FROM table2
    where topic = 'place';
    
    SET @sql = CONCAT('SELECT g.subtopic as `group`, ', @sql, ' 
                      from table2 g
                      left join table2 p
                        on g.id = p.id
                        and p.topic = ''place''
                      where g.topic = ''group''
                      group by g.subtopic');
    
    PREPARE stmt FROM @sql;
    EXECUTE stmt;
    DEALLOCATE PREPARE stmt;
    

    SQL Fiddle with Demo

    【讨论】:

    • 我就在那儿。关于如何在 PHP 中编写这种准备/存储语句的任何想法/教程/示例?
    • @bluefeet 的回答是从 MySQL 的角度来看的(正如问题所提出的那样)。您可以在 PHP 中创建动态 SQL 而不是存储过程。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 1970-01-01
    • 2017-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多