Как выбрать последнее значение i_id по data_id

360
17 мая 2017, 09:22

Добрый день! Есть таблица. В ней нужно выбирать все, но только последние значения i_id по data_id.

CREATE TABLE `dataicraci` (
`di_id` int(10) UNSIGNED NOT NULL,
`i_id` int(10) UNSIGNED NOT NULL,
`data_id` int(10) UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `dataicraci` (`di_id`, `i_id`, `data_id`) VALUES 
(59, 6, 6), 
(62, 1, 5),
(63, 5, 5),
(64, 1, 4),
(65, 4, 4),
(66, 1, 3),
(67, 3, 3),
(68, 1, 12),
(69, 3, 12),
(70, 1, 2),
(71, 3, 2),
(96, 1, 11),
(97, 2, 11),
(102, 1, 1),
(103, 2, 1),
(106, 1, 8),
(107, 6, 8),
(110, 6, 7),
(111, 11, 7);

Т.е. вот эти

(59, 6, 6),
(63, 5, 5),
(65, 4, 4),
(67, 3, 3),
(69, 3, 12),
(71, 3, 2),
(97, 2, 11),
(103, 2, 1),
(107, 6, 8),
(111, 11, 7)

Можно было написать условие WHERE i_id !=1, но может быть что нету i_id равный 1 для конкретного data_id. Может быть и такое, что совпадений для конкретного data_id может быть 3 например (110, 6, 7), (111, 11, 7), (112, 12, 7). В этом случае все равно нужно брать из базы (112, 12, 7)

Answer 1

Пока единственное, что приходит на ум:

SELECT d1.*
FROM dataicraci d1
JOIN (
    SELECT MAX(i_id) AS i_id, data_id 
    FROM dataicraci 
    GROUP BY data_id
) AS tmp
ON d1.`i_id` = tmp.i_id AND d1.`data_id` = tmp.`data_id`

Может быть я помешан на подзапросах и есть другие решения, а может и нет...

READ ALSO
Сложные выборки по времени в MySQL

Сложные выборки по времени в MySQL

Есть таблица в базе, примерно такого вида id, project_id, value, date_updated, то есть таблица хранит значение некоторого параметра для определенного проекта...

479
Laravel: left join + order c null

Laravel: left join + order c null

Допустим есть табличка с людьми

365
@ - что это за оператор в php

@ - что это за оператор в php

Подскажите, где в документации можно найти про него информацию

338
C++ web Fraemwork

C++ web Fraemwork

Всатала задача написать веб приложение на С++До этого писал пару приложений на питоне с использование джанго

452