Пожалуйста, помогите мне в создании этого запроса - PullRequest
1 голос
/ 07 июля 2010

Я хочу извлечь строки группы на rls_id, но с последним / недавним date

SELECT * 
FROM `tbl_revisions` 
WHERE `date` IN (SELECT MAX(`date`) 
                 FROM `tbl_revisions` 
                 GROUP BY `rls_id`) 
GROUP BY `rls_id`

Приведенный выше запрос работает хорошо, но я не хочу использовать подзапросы. Мне нужно как-то иначе.

CREATE TABLE IF NOT EXISTS `tbl_revisions` 
(
  `id` int(21) NOT NULL AUTO_INCREMENT,
  `rls_id` int(21) NOT NULL,
  `date` datetime NOT NULL,
  `user` int(21) NOT NULL,
  `data` blob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=66 ;

Редактировать: Нужен более быстрый путь

Хорошо. я получил 2 рабочих запроса благодаря @Bill Karwin и @OMG Ponies.

Я вставляю Объяснение для обоих запросов здесь, чтобы другие узнали лучше

Bill Karwin :

SELECT r1.*
FROM `tbl_revisions` r1
LEFT OUTER JOIN `tbl_revisions` r2
  ON (r1.`rls_id` = r2.`rls_id` AND r1.`date` < r2.`date`)
WHERE r2.`rls_id` IS NULL;

альтернативный текст http://i49.tinypic.com/x10f0i.png


OMG Ponies:

SELECT t.* 
  FROM TBL_REVISIONS t
  JOIN (SELECT rls_id,
               MAX(date) AS max_date
          FROM TBL_REVISIONS
      GROUP BY rls_id) x ON x.rls_id = t.rls_id
                        AND x.max_date = t.date

альтернативный текст http://i46.tinypic.com/2lxzdzt.png

Ответы [ 4 ]

3 голосов
/ 07 июля 2010

Без использования подзапросов? OK:

SELECT t.* 
  FROM TBL_REVISIONS t
  JOIN (SELECT rls_id,
               MAX(date) AS max_date
          FROM TBL_REVISIONS
      GROUP BY rls_id) x ON x.rls_id = t.rls_id
                        AND x.max_date = t.date

Некоторые могут назвать это подвыборкой, но x более точно называется производной таблицей или встроенным представлением. Подвыборы обычно являются операторами SELECT внутри самого предложения SELECT, например:

SELECT ...,
       (SELECT COUNT(*)...)

В любом случае, проверьте тег "great-n-per-group" для других различных примеров.

2 голосов
/ 07 июля 2010
SELECT r1.*
FROM `tbl_revisions` r1
LEFT OUTER JOIN `tbl_revisions` r2
  ON (r1.`rls_id` = r2.`rls_id` AND r1.`date` < r2.`date`)
WHERE r2.`rls_id` IS NULL;
0 голосов
/ 07 июля 2010

Этот сценарий представлен на сайте MySQL как проблема 'groupwise max'.Похоже, что OMG Ponies все поняли правильно - вы не можете обойтись без каких-либо подзапросов, но версия JOIN-ed OMG Ponies использует «некоррелированный» подзапрос, который более эффективен:

http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

0 голосов
/ 07 июля 2010

Попробуй это:

SELECT * FROM tbl_revisions WHERE date = MAX(date) FROM tbl_revisions GROUP BY rls_id;

Честно говоря, я этого не пробовал, но попробуй.

...