![](/img/trans.png)
[英]mySQL How to select into multiple columns from table based on table conditions?
[英]How to select columns based on multiple conditions?
我有一個包含多個price-timestamp
元組的表:
#mytable;
id;<somecolumns>;price1;timestamp1;price2;timestamp2;
我想在臨時表中導出每個價格時間戳元組,但是僅導出其時間戳在特定時間間隔內的價格:
#mytemp
id;price1;price2;
我可以通過為每個元組重復sql來實現此目的:
INSERT INTO mytemp (price1)
SELECT price1 FROM mytable WHERE timestamp1 > NOW() - INTERVAL 3 HOUR;
INSERT INTO mytemp (price2)
SELECT price2 FROM mytable WHERE timestamp2 > NOW() - INTERVAL 3 HOUR;
#repeat for all price-timestamp tuples
問題:是否可以將其優化為一個SQL查詢 ?
您可以在以下情況下使用案例
SELECT
sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
as price2
FROM mytable ;
但如果要插入,只需選擇
INSERT INTO mytemp (price1,price2)
SELECT
sum(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 else 0 end) as price1,
sum(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 else 0 end)
as price2
FROM mytable
在以下case when
嘗試使用該用case when
INSERT INTO mytemp (price1,price2)
SELECT max(case when timestamp1 > NOW() - INTERVAL 3 HOUR then price1 end),max(case when timestamp2 > NOW() - INTERVAL 3 HOUR then price2 end)
FROM mytable
嘗試這個
SELECT price1 , '' as price2 from testa WHERE timestamp1 > NOW() - INTERVAL 3 HOUR
UNION
SELECT '' as price1, price2 as price from testa WHERE timestamp2 > NOW() - INTERVAL 3 HOUR
您可以使用cross join
聯接取消數據透視:
select (case when n.n = 1 then price1
when n.n = 2 then price2
end),
(case when n.n = 1 then timestamp1
when n.n = 2 then timestamp2
end)
from t cross join
(select 1 as n union all select 2) n
having timestamp > now() - interval 3 hour;
但是,如果您在timestamp
上具有索引,則您的方法或與union all
等效的方法可能是最快的方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.