Я видел примеры для дублирования манипуляций строк, но я не могу понять, как их сопоставить для решения моей проблемы.выбор и удаление строк внутри групп с использованием mysql
+----+------------+------+---------+
| id | date | file | status |
+----+------------+------+---------+
| 1 | 2011-12-01 | 1 | Pending |
| 2 | 2011-12-02 | 1 | Pending |
| 3 | 2011-12-03 | 1 | Done |
| 4 | 2011-12-04 | 1 | Pending |
| 5 | 2011-12-05 | 1 | Done |
| 6 | 2011-12-06 | 1 | Pending |
| 7 | 2011-12-07 | 1 | Pending |
| 8 | 2011-12-08 | 1 | Pending |
| 9 | 2011-12-09 | 2 | Pending |
| 10 | 2011-12-10 | 2 | Pending |
| 11 | 2011-12-11 | 3 | Pending |
| 12 | 2011-12-12 | 4 | Done |
| 13 | 2011-12-13 | 5 | Pending |
| 14 | 2011-12-14 | 5 | Done |
| 15 | 2011-12-15 | 5 | Pending |
+----+------------+------+---------+
Для каждого файла в таблице:
мне нужно сначала выбрать/удалить любую строку, где статус = «В ожидании», и дата его старше младшей даты для любой строки, где статус = «Готово». Например, это будет выбирать/удалять строки с идентификаторами 1, 2, 4 и 13.
Мне нужно следующее выбрать/удалить любую строку, где status = 'Pending', и это не самая старая дата, где status = «В ожидании». Для примера, это выбрать бы/удалить строки с идентификатором 7, 8 и 10.
Полученная таблица:
+----+------------+------+---------+
| id | date | file | status |
+----+------------+------+---------+
| 3 | 2011-12-03 | 1 | Done |
| 5 | 2011-12-05 | 1 | Done |
| 6 | 2011-12-06 | 1 | Pending |
| 9 | 2011-12-09 | 2 | Pending |
| 11 | 2011-12-11 | 3 | Pending |
| 12 | 2011-12-12 | 4 | Done |
| 14 | 2011-12-14 | 5 | Done |
| 15 | 2011-12-15 | 5 | Pending |
+----+------------+------+---------+
Это позволит создать и заполнить тестовую таблицу в MySQL:
CREATE TABLE test
( id
INT (11) NOT NULL AUTO_INCREMENT, date
дата DEFAULT NULL, то file
INT (11) По умолчанию значение NULL, status
VARCHAR (45) По умолчанию значение NULL, ПЕРВИЧНЫЙ КЛЮЧ (id
) ) ДВИГАТЕЛЬ = InnoDB AUTO_INCREMENT = 16 = CHARSET УМОЛЧАНИЮ latin1;
INSERT INTO test
VALUES (1, '2011-12-01', 1, 'Pending'), (2, '2011-12-02', 1, 'Pending'), (3, '2011- 12-03 ', 1,' Done '), (4,' 2011-12-04 ', 1,' Pending '), (5,' 2011-12-05 ', 1,' Done '), (6 , '2011-12-06', 1, 'Pending'), (7, '2011-12-07', 1, 'Pending'), (8, '2011-12-08', 1, 'Pending'), (9, '2011-12-09', 2, 'Pending'), (10, '2011-12-10', 2, 'Pending'), (11, '2011-12-11', 3 , «Ожидание»), (12, «2011-12-12», 4, «Готово»), (13, 2011-12-13, 5, «Ожидание»), (14, 2011-12- 14 ', 5,' Done '), (15,' 2011-12-15 ', 5,' Pending ');
Благодаря ziesemer для корректных запросов SELECT, я многому научился у них. К сожалению, похоже, что MySQL не позволяет DELETE с подзапросом, поэтому я преобразовал ответ ziesemer вместо JOINS. Но я SQL нуб, поэтому, пожалуйста, поправьте, если они могут быть улучшены:
SELECT DISTINCT t1.* FROM test t1 INNER JOIN test t2
WHERE t1.file = t2.file
AND t1.status = 'Pending'
AND t2.status = 'Done'
AND t1.date < t2.date;
SELECT DISTINCT t1.* FROM test t1 INNER JOIN test t2
WHERE t1.file = t2.file
AND t1.status = 'Pending'
AND t2.status = 'Pending'
AND t1.date > t2.date;
Чтобы удалить, заменить ВЫБЕРИТЕ линию:
DELETE t1 FROM test t1 INNER JOIN test t2
Это Безразлично» t нужно выбрать один или удалить, если это невозможно. Но у меня возникают проблемы с превращением этих выборок в удаления. Можете ли вы показать мне, как это сделать? Я использую 5.5.16. Спасибо. – osoviejo
Просто замените первый 'Select * From' на' Delete From' (только для внешнего запроса, а не для внутреннего запроса). – ziesemer
Вот что я пробовал: MySQL> Удалить -> Из тестового t1 -> Где (статус = 'В ожидании' -> И дата <( -> Выберите Max (дата) -> Из тестового t2 -> Где t2.file = t1.file -> И t2.status = 'Done')); ERROR 1064 (42000): У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 't1 Где (status =' Pending ' И дата <( ) Выберите Max (dat' at line 2 – osoviejo