2017-02-03 2 views
0

Мне нравится удалять дубликаты из таблицы game. Есть записи с теми же playerId и timeParameter, и те, у которых самый низкий gameId, должны оставаться.Удалить без псевдонима

Я могу запросить записи с:

select a.`gameId` from `game` a 
where not exists 
    (select min(b.`gameId`) as m from `game` b 
    group by b.`playerId`, b.`timeParameter` 
    having m = a.`gameId`); 

Но я не могу использовать Алиса в ВЕЯТ:

delete from `game` a 
where not exists 
    (select min(b.`gameId`) as m from `game` b 
    group by b.`playerId`, b.`timeParameter` 
    having m = a.`gameId`); 

Получения синтаксической ошибки:

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual 
that corresponds to your MariaDB server version for the right syntax to use near 'a 
where not exists 
    (select min(b.`gameId`) as m from `game` b 
    group by b.`' at line 1 

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

Есть ли решение для этого?

+0

даже вы не можете удалить это с помощью оператора выбора с той же таблицей –

+0

Посмотрите на это http://stackoverflow.com/questions/4562787/how-to-delete-from-select-in-mysql – rpd

+0

@vertex, если вам нравятся мои анны, чем вы можете голосовать и получать pt это? –

ответ

1

Вы можете сделать запрос к югу и сделать один производную таблицу

delete from game where gameId IN 
(
select gameId from(
select a.`gameId` from `game` a 
where not exists 
    (select min(b.`gameId`) as m from `game` b 
    group by b.`playerId`, b.`timeParameter` 
    having m = a.`gameId`) 
)tmp 
) 
+0

Спасибо, но это не сработает: 'ERROR 1093 (HY000): таблица« игра »указана дважды, как в качестве цели для« DELETE », так и как отдельный источник данных, как сказал кришнал. – Vertex

+0

Можете ли вы предоставить скрипку с образцами данных, я дам попробовать – sumit

+0

попробуйте сейчас ........ – sumit

1

Это правильно и в документации MySQL, если вы используете псевдоним, то вы должны будете передать его в DELETE заявления. Так или удалить псевдоним a или сделать ваше DELETE заявление как

delete a from `game` a ... 

Цитируя Documentation

Note

If you declare an alias for a table, you must use the alias when referring to the table:

DELETE t1 FROM test AS t1, test2 WHERE ...

1

Использование @krishn Патель идея создать временную таблицу, это должно работать.

Сначала создайте стол dontDeleteMe который содержит все игры, которые должны оставаться.

create table `dontDeleteMe` as 
     select min(`gameId`) as `theId` from `game` 
     group by `playerId`, `timeParameter`; 

Чем я могу использовать эту таблицу для подзапроса:

delete from `game` 
where `gameId` not in 
    (select `theId` from `dontDeleteMe`); 

И после того, что я могу упасть временную таблицу:

drop table `dontDeleteMe`; 
+0

вы можете попробовать @rahul ans? –

+0

вы можете сделать производную таблицу и сделать это, используя единый sql..это плохая идея – sumit

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