2011-09-27 142 views
0

我有一個表格跟蹤按日期的聯繫人類別狀態更改。我試圖回答的問題是,某個日期的所有聯繫人的當前狀態如何。MySQL子查詢/複雜查詢問題,跟蹤狀態變化

DROP TABLE IF EXISTS `contact_class_state`; 
CREATE TABLE `contact_class_state` (
    `id` int unsigned NOT NULL AUTO_INCREMENT, 
    `contact_id` int unsigned DEFAULT NULL, -- the contact 
    `contact_class` int unsigned, 
    `state_date` date, 
PRIMARY KEY (`id`), 
INDEX (`contact_id`) 
) DEFAULT CHARSET=utf8; 

INSERT INTO `contact_class_state` (`contact_id`, `contact_class`, `state_date`) VALUES 
(1, 1, '2011-01-01'), 
(2, 1, '2011-01-01'), 
(3, 1, '2011-01-01'), 
(4, 1, '2011-01-01'), 
(5, 1, '2011-01-01'), 
(1, 2, '2011-02-01'), 
(3, 2, '2011-02-01'), 
(5, 2, '2011-02-01'), 
(1, 1, '2011-02-15'), 
(5, 3, '2011-03-01'); 

例如,下面的查詢:

SELECT contact_id, contact_class, state_date 
FROM contact_class_state 
WHERE state_date <= '2011-02-27' 
ORDER BY contact_id, state_date DESC 

回報

+------------+---------------+------------+ 
| contact_id | contact_class | state_date | 
+------------+---------------+------------+ 
|   1 |    1 | 2011-02-15 | 
|   1 |    2 | 2011-02-01 | 
|   1 |    1 | 2011-01-01 | 
|   2 |    1 | 2011-01-01 | 
|   3 |    2 | 2011-02-01 | 
|   3 |    1 | 2011-01-01 | 
|   4 |    1 | 2011-01-01 | 
|   5 |    2 | 2011-02-01 | 
|   5 |    1 | 2011-01-01 | 
+------------+---------------+------------+ 

儘管這在技術上是正確的,我只需要爲每一個第一(或最後如果排序的ASC)行contact_id作爲最新的日期將總是給我目前的聯繫狀態,如下所示:

+------------+---------------+------------+ 
| contact_id | contact_class | state_date | 
+------------+---------------+------------+ 
|   1 |    1 | 2011-02-15 | 
|   2 |    1 | 2011-01-01 | 
|   3 |    2 | 2011-02-01 | 
|   4 |    1 | 2011-01-01 | 
|   5 |    2 | 2011-02-01 | 
+------------+---------------+------------+ 

我非常確定一個子查詢或複雜的查詢可以做到這一點,但我對SQL有心理障礙。我也接受其他方法來解決這個問題。

謝謝!

回答

0

如果您的查詢實際上是您想要的(除非通過contact_id分組),然後執行該操作。

SELECT * FROM 
(SELECT contact_id, contact_class, state_date 
FROM contact_class_state 
WHERE state_date <= '2011-02-27' 
ORDER BY contact_id, state_date DESC) table1 
GROUP BY contact_id 

這是測試和工作完美。

+0

也許我錯過了一些東西,但有沒有理由你需要子選擇? – Dave

+1

謝謝!我在使用GROUP BY而不使用子查詢。現在有道理。如果有人有任何建議,我也會接受完全不同的方法。 – rojosnow

+0

@Dave您需要先獲得所需的結果,然後按聯繫人進行分組,以獲得每個聯繫人的第一個結果集。下面的解決方案不會返回正確的contact_class。 – ask21900