2014-10-06 50 views
1

以下是兩列表的示例,我使用按位運算符來存儲日期。將單行展開爲多行

-- +---------+------+ 
-- | Title | Days | 
-- +---------+------+ 
-- | Title 1 | 127 | 
-- | Title 2 | 12 | 
-- | Title 3 | 8 | 
-- | Title 4 | 36 | 
-- +---------+------+ 

我想要的是做一個查詢和擴大每一行,所以它是基於天數重複,並且每行只包含一天。

-- +---------+------+ 
-- | Title | Days | 
-- +---------+------+ 
-- | Title 1 | 1 | 
-- | Title 1 | 2 | 
-- | Title 1 | 4 | 
-- | Title 2 | 4 | 
-- | Title 4 | 4 | 
-- | Title 1 | 8 | 
-- | Title 2 | 8 | 
-- | Title 3 | 8 | 
-- | Title 1 | 16 | 
-- | Title 1 | 32 | 
-- | Title 4 | 32 | 
-- | Title 1 | 64 | 
-- +---------+------+ 

我已經有了一個解決方法,讓應用程序多次查詢數據庫以檢索每一天的行。

SELECT * FROM `table_name` WHERE (`days` & 1) = 1; -- ... and so on 

但我想如果我能做到這一點在一個單一的查詢,可以加快性能。

回答

2

您可以在要展開的位掩碼之間加入一個使用UNION ALL構造的常量表;

SELECT a.title, b.value days 
FROM mytable a 
JOIN (SELECT 1 value UNION ALL SELECT 2 UNION ALL SELECT 4 UNION ALL 
     SELECT 8 UNION ALL SELECT 16 UNION ALL SELECT 32 UNION ALL SELECT 64) b 
    ON a.days & b.value 
ORDER BY title, b.value 

An SQLfiddle to test with

+0

謝謝,解決了這個問題。我只是修改了順序,以達到我想要的。 'ORDER BY b.value,a.title' – 2014-10-06 08:12:57