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