Подзапрос MySQL / сложный вопрос, отслеживание изменений состояния - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть таблица, которая отслеживает изменения состояния класса контактов по дате.Вопрос, на который я пытаюсь ответить, заключается в том, каково текущее состояние всех контактов на определенную дату.

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.Я также открыт для других подходов к решению этой проблемы.

Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2011

Если ваш запрос на самом деле то, что вы хотите (за исключением того, что сгруппированы по 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

Это проверено и отлично работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...