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有心理障碍。我也接受其他方法来解决这个问题。
谢谢!
也许我错过了一些东西,但有没有理由你需要子选择? – Dave
谢谢!我在使用GROUP BY而不使用子查询。现在有道理。如果有人有任何建议,我也会接受完全不同的方法。 – rojosnow
@Dave您需要先获得所需的结果,然后按联系人进行分组,以获得每个联系人的第一个结果集。下面的解决方案不会返回正确的contact_class。 – ask21900