mysql - 从分组行中的同一列获取特定值

标签 mysql group-by

这是一个问题,我有一个有效的查询,但对我来说效率非常低,我需要一些帮助来构建一个更好的查询。这将进入实时生产环境,数据库每天处理的查询数量非常高,因此效率越高越好。我有一个类似这样结构的表格(仅保留相关部分):

id | type | datecolumn
1  | A    | 2014-01-01
1  | B    | 0000-00-00
2  | A    | 2014-01-02
2  | B    | 2014-01-10
3  | A    | 2014-01-01
3  | B    | 0000-00-00

每个 id 始终有两行,一行为 A 类型,另一行为 B 类型。A 始终具有有效日期,B 的日期要么 >= A 的日期,要么全为 0。我想要的是一个将产生与此类似的输出的查询:

id | date for A | date for B
1  | 2014-01-01 | None
2  | 2014-01-02 | 2014-01-10
3  | 2014-01-01 | None

我现在的做法如下:

SELECT
    id,
    IF(MIN(datecolumn) > 0, MIN(datecolumn), MAX(datecolumn)) AS 'date for A',
    IF(MIN(datecolumn) > 0, MAX(datecolumn), 'None') AS 'date for B'
GROUP BY id

但感觉我应该能够以某种方式按类型提取日期列值。我知道最简单的解决方案应该是更改表结构,使每个 id 只使用一行,但恐怕在这种情况下这是不可能的;必须有两行。有没有办法在此查询中正确利用类型列?

编辑:另外,这是一个包含 10,000,000 行以上的表。再说一次,效率是关键。

最佳答案

我会坚持你的做法,但也许可以这样写......

CREATE TABLE my_table
(id INT NOT NULL
,type CHAR(1) NOT NULL
,datecolumn DATE NOT NULL DEFAULT '0000-00-00'
,PRIMARY KEY(id,type)
);

INSERT INTO my_table VALUES
(1  ,'A','2014-01-01'),
(1  ,'B','0000-00-00'),
(2  ,'A','2014-01-02'),
(2  ,'B','2014-01-10'),
(3  ,'A','2014-01-01'),
(3  ,'B','0000-00-00');

 SELECT id
      , MAX(CASE WHEN type = 'A' THEN datecolumn END) a
      , MAX(REPLACE(CASE WHEN type='B' THEN datecolumn END,'0000-00-00','none')) b 
   FROM my_table 
  GROUP 
     BY id;
+----+------------+------------+
| id | a          | b          |
+----+------------+------------+
|  1 | 2014-01-01 | none       |
|  2 | 2014-01-02 | 2014-01-10 |
|  3 | 2014-01-01 | none       |
+----+------------+------------+

关于mysql - 从分组行中的同一列获取特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21101429/

相关文章:

SQL Group by 具有聚合和不同

mysql 按电子邮件地址和计数进行分组

mysql - 连接表以从两个表中选择数据时出错

mysql - 如何连接 2 个 MySQL 表而不返回所有连接行

sql - 从两个表中检索一个查询?

sql - 如何规范分组依据列的大小写?

Mysql 查询不工作

mysql - 如何高效地远程从数百万行的MySQL中提取数据? (mysqldump 不是一个选项)

php - 如何使用PHP限制用户上传图片的大小

python - 是否可以在python中将多索引更改为正常