mysql自连接基于枚举值

时间:2013-01-29 17:02:50

标签: mysql join pivot self-join

如何使用自联接

根据枚举状态获取计数

我有一个名为“student”的表,其中我使用enum作为状态0,1,2,其中0表示非活动状态,1表示活动状态,2表示已删除状态。

studentid studentenrollid studentname studentstatus

1          3                 xyz          1

2          3                 xyz          2

3          8                 asda         1

4          7                 sdd          1

5          9                 asds         0

6          3                 xyz          1

我需要根据studentrollid独特的状态获取计数。

studentrollid | inactive | active | deleted

    3            0           2        1

    8            0           1        0

    7            0           1        0

    9            1           0        0

2 个答案:

答案 0 :(得分:1)

请试试这个:

SQLFIDDLE DEMO

select studentenrollid,
sum(case when studentstatus = 1 then 1
    else 0 end) as Active, 
sum(case when studentstatus = 0 then 1
    else 0 end) as Inactive, 
sum(case when studentstatus = 2 then 1
    else 0 end) as Deleted
from demo
group by studentenrollid
;

| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
|               3 |      2 |        0 |       1 |
|               7 |      1 |        0 |       0 |
|               8 |      1 |        0 |       0 |
|               9 |      0 |        1 |       0 |

Another shorter query:

select a.studentenrollid,
sum(a.studentstatus = 1) as Active, 
sum(a.studentstatus = 0) as Inactive,
sum(a.studentstatus = 2) as Deleted 
from demo a
group by a.studentenrollid
;

| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
|               3 |      2 |        0 |       1 |
|               7 |      1 |        0 |       0 |
|               8 |      1 |        0 |       0 |
|               9 |      0 |        1 |       0 |

MYSQL 5.1.61 version query


根据评论中给出的OP的创建陈述/插入陈述:

SQLFIDDEL DEMO 2

| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
|               1 |      1 |        0 |       0 |
|               2 |      1 |        0 |       0 |
|               3 |      1 |        0 |       0 |
|              41 |      9 |        1 |       1 |

答案 1 :(得分:0)

您可以使用带有CASE表达式的聚合函数来 pivot 数据:

select studentenrollid,
  count(case when studentstatus = '0' then studentid end) InActive,
  count(case when studentstatus = '1' then studentid end) Active,
  count(case when studentstatus = '2' then studentid end) Deleted
from yourtable
group by studentenrollid

请参阅SQL Fiddle with Demo

结果是:

| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
|               3 |        0 |      2 |       1 |
|               7 |        0 |      1 |       0 |
|               8 |        0 |      1 |       0 |
|               9 |        1 |      0 |       0 |

编辑#1,使用您在评论中放置的示例数据:

CREATE TABLE IF NOT EXISTS demo 
( 
  studentid int(11) NOT NULL AUTO_INCREMENT, 
  studentenrollid int(11) NOT NULL, 
  studentstatus enum('0','1','2') NOT NULL DEFAULT '1', 
  PRIMARY KEY (studentid), 
  KEY studentenrollid (studentenrollid) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=84 ;


INSERT INTO demo (studentid, studentenrollid, studentstatus) 
VALUES
(22, 41, '2'),
(23, 1,'1'),
(24, 2, '1'),
(25, 3, '1'),
(26, 41, '1'),
(29, 41, '1'),
(30, 41, '1'),
(31, 41, '1'),
(32, 41, '1'),
(33, 41, '1'),
(34, 41,'1'),
(35, 41, '1'),
(36, 41, '1'),
(37, 41, '1') 

您的查询将是:

select studentenrollid,
  count(case when studentstatus = '0' then studentid end) InActive,
  count(case when studentstatus = '1' then studentid end) Active,
  count(case when studentstatus = '2' then studentid end) Deleted
from demo
group by studentenrollid

结果(见SQL Fiddle with Demo):

| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
|               1 |        0 |      1 |       0 |
|               2 |        0 |      1 |       0 |
|               3 |        0 |      1 |       0 |
|              41 |        0 |     10 |       1 |

请注意,您只获得了已删除的计数,因为这是您在数据库中的唯一值(至少在示例数据中)。