我有一个表,需要在不同行上的结果,其中必须存在一列中的不同键值。
我每天从另一个系统通过REST API获取此表,并在我的MySQL DB中查找此(simplfied):
+----+------+------------+-------+
| ID | type | date | value |
+----+------+------------+-------+
| 1 | A | 2019-06-01 | 1 |
| 2 | B | 2019-06-01 | 2 |
| 3 | A | 2019-06-02 | 4 |
| 4 | B | 2019-06-03 | 5 |
| 9 | A | 2019-06-09 | 11 |
| 10 | B | 2019-06-09 | 14 |
| 11 | A | 2019-06-24 | 99 |
+----+------+------------+-------+
现在,我需要一个select,它只会在同一日期存在类型A和类型B的值时生成所有内容。结果应如下所示:
+------------+-------+--------+----+------+------------+-------+
| date | typeA | valueA | ID | type | date | value |
+------------+-------+--------+----+------+------------+-------+
| 2019-06-01 | A | 1 | 2 | B | 2019-06-01 | 2 |
| 2019-06-09 | A | 11 | 10 | B | 2019-06-09 | 14 |
+------------+-------+--------+----+------+------------+-------+
- 第一个想法:
使用子选择......对于大型表来说可能是坏主意......但我不确定。
SELECT * from
(SELECT date as dateA, value as valueA from V1 where type = 'A') AS subA,
(SELECT date as dateB, value as valueB from V1 where type = 'B') AS subB
WHERE dateA = dateB
- 第二个想法:
创建两个临时表,然后创建一个连接。但是需要时间来创建两个表以及两个新临时表的连接。
CREATE TEMPORARY table tA SELECT date, type as typeA, value as valueA from V1 WHERE type = 'A';
CREATE TEMPORARY table tB SELECT date, type as typeB, value as valueB from V1 WHERE type = 'B';
SELECT * from tA
INNER JOIN tB on tA.date = tB.date;
- 第三个想法:
仅在临时表上创建并使用主表进行连接:
CREATE TEMPORARY table tB SELECT * from V1 WHERE type = 'B';
SELECT * from V1
INNER JOIN tB on V1.date = tB.date
where V1.type = 'A'
我的哪个想法最适合大桌子,或者是否有更好的解决方案。
预先感谢。
分析解答
一种有效的方法可以基于具有不同count = 2的日期和表本身一次用于ype A和一个用于类型b的tyme之间的内部联接
select t.date, t1.type typeA, t1.value valueA, t2.type typeB, t2.value valueB,
from (
select date
from my_table
group by date
having count(distinct type) = 2
) t
inner join my_table t1 on t1.date = t.date and type='A'
inner join my_table t2 on t2.date = t.date and type='B'