Ограничение результатов нескольких полей (MySQL) - PullRequest
1 голос
/ 26 января 2012

Моя структура таблицы выглядит следующим образом:

      mid   | tid  | data
    | 1     | 0    |  data
    | 1     | 1    |  data
    | 1     | 2    |  data
    | 1     | 3    |  data
    | 1     | 4    |  data
    | 2     | 0    |  data
    | 2     | 1    |  data
    | 3     | 0    |  data
    | 3     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data
              .
              .
              .
    | N     | 0    |  data
    | N     | 1    |  data
    | N     | 2    |  data
              .
              .
    | N     | K    |  data

Каждая запись идентифицируется 2 индексами, серединой и тидом.Tid будет уникальным для каждой середины.Для каждой середины прилив начинается с 0 и считается вверх до К. Для данной середины может быть неизбежно много приливов, и может быть бесконечно много середин.

Что я хочу сделать, это выбрать 3 самых последнихMID и соответствующие им последние приливы ГДЕ данные соответствуют некоторым критериям (скажем,> 1).Если бы только MID 1, 2, 3 и 4 соответствовали требованиям к данным, я бы хотел, чтобы они вернулись (пропуская 1, поскольку это не 3 самых последних, а 4-х):

    | 2     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data

Я потеряно том, как это сделать, любая помощь будет оценена.Двойной заказ по LIMIT 3 вернет

    | 3     | 1    |  data
    | 3     | 2    |  data
    | 4     | 0    |  data

Ответы [ 2 ]

2 голосов
/ 26 января 2012

JOIN против подзапроса, который получает MAX(tid) для каждого mid:

SELECT 
  t.mid,
  t.tid,
  t.data
FROM tbl t JOIN (
  SELECT mid, MAX(tid) AS maxtid FROM tbl GROUP BY mid
) m ON t.mid = m.mid AND t.tid = m.tid
/* WHERE (some condition) */
ORDER BY t.mid DESC
LIMIT 3

Обновление: Добавлено предложение ORDER BY & LIMIT, которое я пропустил в ОП.

0 голосов
/ 26 января 2012

Вы, вероятно, можете сделать это:

SELECT * FROM data_table
WHERE
  mid IN (SELECT DISTINCT mid FROM data_table ORDER BY mid DESC LIMIT 3) AND 
  data > 1
...