2016-03-05 5 views
3

У меня есть таблица, содержащая два внешних ключа. Мне нужно удалить все строки, где key1 & key2 те же, но val < $ x.MySQL: удаление записей на основе максимального значения

ключ1 & ключ2 не являются четкими значениями; может быть несколько записей с одной и той же клавишей 1 и/или ключ1/ключ2.

Я пробовал несколько подходов, но не могу заставить работать. Каждый подход до сих пор приводит к ошибке MySQL (например, «невозможно открыть таблицу») или неверному результату.

Выборочные данные из таблицы:

rownum key1 key2 val col col2 col3 col4 
1  123  1  2  a  b  c  d 
2  123  1  2  e  f  g  h 
3  123  2  3  i  j  k  l 
4  123  2  3  m  n  o  p 
5  456  1  1  q  r  s  t 

Мне нужно удалить все строки, где «Вал» является < высшим «ВАЛ» для любой пары key1/key2.

Другими словами, для каждой отдельной комбинации key1/key2 мне нужно найти max "val" ($ x) и удалить любую строку, где val - < $ x.

Таким образом, желаемый результат после удаления утверждения:

rownum key1 key2 val col col2 col3 col4 
3  123  2  3  i  j  k  l 
4  123  2  3  m  n  o  p 
5  456  1  1  q  r  s  t  

(. Цв-COL4 не имеют значения при определении, какие записи удалить, я включил их только отметить, что таблица содержит дополнительные столбцы)

key1, key2 и "val" - все типы int.

Как удалить строки, где key1 & key2 - это то же самое, но val < $ x?

+0

Покажите нам запросы, которые вы пробовали. –

+2

В случае 'key1 = 123' и' key2 = 2' combo наибольшее значение 'val' будет равно 3. Следовательно,' key2' меньше 3 в обоих случаях, так почему же комбо не удаляется? –

+0

Извините, произошла ошибка в сообщении (теперь редактируется).Я хотел сказать: «Мне нужно удалить все строки, где« val »- это <самый высокий« val »для любой пары key1/key2.» – fournines

ответ

1

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

Во-первых, мы должны найти максимум из key2 для каждого ключом1

SELECT key1 as fk1, max(key2) as max_key2 from table group by key1 

Тогда все строки где key2 < max_key2

SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1 

Затем удалите те строки

DELETE from table where primary_key in (SELECT id from (SELECT t.primary_key as id, s.fk1, s.max_key2, t.key1 from table as t, (SELECT key1 as fk1, max(key2) as max_key2 from table group by key1) as s WHERE t.key2 < s.max_key2 AND s.fk1 = t.key1)) 

Я не тестировал это, но это примерно так, как я мог бы решить проблему.

Это должно пойти, не говоря, но проверить, прежде чем удалить и резервные копии

2

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

DELETE t1 FROM table1 t1, table1 t2 
WHERE t1.key1=t2.key1 AND t1.key2=t2.key2 AND t1.val < t2.val 

Sqlfiddle - Я изменил данные выборки, чтобы иметь разные валы для пар ключей.

Смежные вопросы