MySQL - исключить строки из Select на основе дублирования двух столбцов - PullRequest
1 голос
/ 07 января 2011

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

Предположим, что следующая структура таблицы представляет данные, которые уже был выбран моим существующим сложным запросом (здесь упорядочен по date):

+----+-----------+------+------------+
| id | remote_id | type | date       |
+----+-----------+------+------------+
|  1 |         1 | A    | 2011-01-01 |
|  3 |         1 | A    | 2011-01-07 |
|  5 |         1 | B    | 2011-01-07 |
|  4 |         1 | A    | 2011-05-01 |
+----+-----------+------+------------+

Мне нужно выбрать из этого набора данных на основе следующих критериев:

  • Если пары remote_id и type уникальны для набора, всегда возвращать строку
  • Если спаривание remote_id и type является не уникальным для набора, выполните следующее действие:
    • Из наборов строк, для которых спариваниеremote_id и type не являются уникальными, возвращают только единственную строку, для которой date равно наибольший и все еще меньше или равно сейчас.

Итак, если сегодня 2011-01-10, я бы хотел, чтобы возвращаемый набор данных был:

+----+-----------+------+------------+
| id | remote_id | type | date       |
+----+-----------+------+------------+
|  3 |         1 | A    | 2011-01-07 |
|  5 |         1 | B    | 2011-01-07 |
+----+-----------+------+------------+

Почему-то ябезуспешно, оборачиваясь вокруг этого.Я подозреваю, что ответ заключается в хорошем применении group by, но я просто не могу понять это.Любая помощь с благодарностью!

Ответы [ 5 ]

4 голосов
/ 07 января 2011
/* Rows with exactly one date - always return regardless of when date occurs */
SELECT id, remote_id, type, date
    FROM YourTable
    GROUP BY remote_id, type
    HAVING COUNT(*) = 1
UNION
/* Rows with more than one date - Return Max date <= NOW */
SELECT yt.id, yt.remote_id, yt.type, yt.date
    FROM YourTable yt
        INNER JOIN (SELECT remote_id, type, max(date) as maxdate
                        FROM YourTable
                        WHERE date <= DATE(NOW())
                        GROUP BY remote_id, type
                        HAVING COUNT(*) > 1) sq
             ON yt.remote_id = sq.remote_id
                 AND yt.type = sq.type
                 AND yt.date = sq.maxdate
1 голос
/ 07 января 2011

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

SELECT a.*
  FROM table a INNER JOIN 
             (
                select remote_id, type, MAX(date) date, COUNT(1) cnt from table
                 group by remote_id, type
             ) b
 WHERE a.remote_id = b.remote_id, 
                 AND a.type = b.type
                 AND a.date = b.date
                 AND ( (b.cnt = 1) OR (b.cnt>1 AND b.date <= DATE(NOW())))
1 голос
/ 07 января 2011

Предложение group by группирует все строки, имеющие одинаковые значения одного или нескольких столбцов, и возвращает для них одну строку в наборе результатов.Если вы используете агрегатные функции (min, max, sum, avg и т. Д.), Которые будут применяться для каждой «группы».

SELECT id, remote_id, type, max(date) 
FROM blah 
GROUP BY remote_id, date;

Я не та шлюха, где приходит сегодняшняя дата, но предполагается, что она былачасть сложного запроса, который вы не описали, и я предполагаю, что он не имеет прямого отношения к вашему вопросу здесь.

0 голосов
/ 07 января 2011

Привет, Карсон!Вы можете попытаться использовать ключевое слово «Different» в этих двух полях, и в объединении вы можете использовать Count () вместе с group by и некоторыми операторами для извлечения неуникальных (самых больших и меньших, чем сегодня) записей!

0 голосов
/ 07 января 2011

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

select id, remote_id, type, MAX(date) from table
group by remote_id, type
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...