Поиск дублей в базе

12
D
На сайте с 28.06.2008
Offline
1114
724

Помогите изменить запрос

SELECT * FROM `xyfq1_items`
WHERE (
fullname, section_id
)
IN (
SELECT fullname, section_id
FROM `xyfq1_items`
GROUP BY fullname, section_id
HAVING COUNT( fullname ) > 1
)
ORDER BY fullname, section_id

Нашел я дубли, как теперь удалить те из них, у которых поле hits = 0 ?

dma84
На сайте с 21.04.2009
Offline
168
#1


DELETE FROM `xyfq1_items`
WHERE `id` IN
(
SELECT `id` FROM `xyfq1_items`
WHERE (fullname, section_id)
IN
(
SELECT fullname, section_id
FROM `xyfq1_items`
GROUP BY fullname, section_id
HAVING COUNT( fullname ) > 1
)
) AND
`hits` = 0;
edogs software
На сайте с 15.12.2005
Offline
775
#2

Нельзя одним запросом удалять из таблицы из которой выбираешь.

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

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft
dma84
На сайте с 21.04.2009
Offline
168
#3
edogs:
Нельзя одним запросом удалять из таблицы из которой выбираешь.

Где такое написано?

D
На сайте с 28.06.2008
Offline
1114
#4

dma84, #1093 - Table 'xyfq1_items' is specified twice, both as a target for 'DELETE' and as a separate source for data

а как правильно через временную?

dma84
На сайте с 21.04.2009
Offline
168
#5
Dram:
dma84, #1093 - Table 'xyfq1_items' is specified twice, both as a target for 'DELETE' and as a separate source for data

Действительно, стоило на 2 месяца забыть про мускул и ударил лицом в грязь.

Есть грязный хак для этого дела, почитать можно здесь.

D
На сайте с 28.06.2008
Offline
1114
#6

Вижу что нужно добавить подзапрос SELECT * FROM и какое то AS p но не пойму в какое место это присобачить на моем примере

Так?



WHERE `id` IN
SELECT * FROM (
(
SELECT `id` FROM `xyfq1_items`
WHERE (fullname, section_id)
IN
(
SELECT fullname, section_id
FROM `xyfq1_items`
GROUP BY fullname, section_id
HAVING COUNT( fullname ) > 1
)
) AND
`hits` = 0;
) AS p

dma84
На сайте с 21.04.2009
Offline
168
#7
Dram:
Вижу что нужно добавить подзапрос SELECT * FROM и какое то AS p но не пойму в какое место это присобачить на моем примере

Так?

AS p - это псевдоним.

В примере по ссылке 1 вложенный подзапрос на ту же таблицу, а в вашем случае - 2. Не знаю, будет ли такое работать.

D
На сайте с 28.06.2008
Offline
1114
#8

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

CREATE TEMPORARY TABLE `t_temp` as (
SELECT * FROM `xyfq1_items`
WHERE (
fullname, section_id
)
IN (
SELECT fullname, section_id
FROM `xyfq1_items`
GROUP BY fullname, section_id
HAVING COUNT( fullname ) > 1
)
and hits = 0
);

DELETE FROM xyfq1_items
WHERE id IN (SELECT * FROM t_temp);

База ругается - #1241 - Операнд должен содержать 1 колонок

dma84
На сайте с 21.04.2009
Offline
168
#9

WHERE id IN (SELECT `id` FROM t_temp);

D
На сайте с 28.06.2008
Offline
1114
#10

Найдено 3 ошибок при анализе.

Ожидалась открывающая скобка. (near "as" at position 32)

Ожидалось объявление, по крайней мере, одного столбца. (near " " at position 31)

Неожиданный токен. (near ")" at position 250)

SQL запрос: Документация

CREATE TEMPORARY TABLE `t_temp` as ( SELECT * FROM `xyfq1_items` WHERE ( fullname, section_id ) IN ( SELECT fullname, section_id FROM `xyfq1_items` GROUP BY fullname, section_id HAVING COUNT( fullname ) > 1 ) and hits = 0 )

Ответ MySQL: Документация

#1205 - Таймаут ожидания блокировки истек; попробуйте перезапустить транзакцию

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий