SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.01.2017 15:22:41

VirtualMan
Участник
Зарегистрирован: 08.01.2017
Сообщений: 4

Выборка дубликатов

Запрос выдает ошибку:
Ошибка в запросe (1241): Operand should contain 1 column(s)

Код:

SELECT *
FROM testtable
WHERE Phone IN
(
SELECT COUNT(*), Phone
FROM testtable
GROUP BY Phone
HAVING COUNT(*) > 5)

Подскажите пожалуйста что делаю не так?
Цель - получить все значения строк в которых один и тот же телефон повторяется более 5 раз

Неактивен

 

#2 08.01.2017 15:27:37

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка дубликатов

COUNT(*), Phone - 2 колонки, а должна быть только 1.

для вашей задачи подзапрос не нужен

SELECT *
FROM testtable
GROUP BY Phone
HAVING COUNT(*) > 5

Неактивен

 

#3 10.01.2017 12:21:16

VirtualMan
Участник
Зарегистрирован: 08.01.2017
Сообщений: 4

Re: Выборка дубликатов

Да спасибо.
Но теперь проблема с обновлением аналогичных дублирующих строк.

Код:

UPDATE testtable
SET Status = 'VIP'
WHERE Phone IN (SELECT Phone
FROM testtable
WHERE Status = 'VIP'
GROUP BY Phone)

Ругается: Ошибка в запросe (1093): You can't specify target table 'avitoads' for update in FROM clauseОшибка в запросe (1093): You can't specify target table 'avitoads' for update in FROM clause

Может из за одного и того же имени таблицы и нужно использовать псевдонимы?

Отредактированно VirtualMan (10.01.2017 12:22:59)

Неактивен

 

#4 10.01.2017 12:26:07

klow
Старожил
Зарегистрирован: 06.12.2014
Сообщений: 411

Re: Выборка дубликатов

Попробуйте такой вариант

UPDATE testtable
SET Status = 'VIP'
WHERE Phone IN (SELECT * FROM (SELECT Phone
FROM testtable
WHERE Status = 'VIP'
GROUP BY Phone) t)


это в лоб, но думаю есть более грамотное решение

Отредактированно klow (10.01.2017 12:26:21)

Неактивен

 

#5 10.01.2017 12:48:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5827

Re: Выборка дубликатов

klow написал:

это в лоб, но думаю есть более грамотное решение

Это решение, которое рекомендуют в документации. Другой способ - это использовать много-табличную форму UPDATE, примеры тут. Суть в том же - переносим второе упоминание таблицы в часть from, где она материализуетя. Отличие эстетическое и в ряде версий много-табличные UPDATE (DELETE) оптимизатор умеет лучше оптимизировать.

Неактивен

 

#6 10.01.2017 13:04:01

VirtualMan
Участник
Зарегистрирован: 08.01.2017
Сообщений: 4

Re: Выборка дубликатов

Спасибо за решение и полезную информацию по альтернативному решению

Правда с более сложным запросом Двойной селект ругается:
Ошибка в запросe (1292): Incorrect datetime value: '2015%' for column 'DataAdd' at row 1
Столбец DATA - это datetime

Код:

UPDATE testtable
SET Status = 'VIP'
WHERE Phone IN (
SELECT * FROM (
SELECT Phone
FROM testtable
WHERE (Data NOT LIKE '2015%') AND (Status IS NULL OR Status <> 'VIP')
GROUP BY Phone
HAVING COUNT(Phone) > 5 AND COUNT(DISTINCT Title) > 5) AS Temp)

Отредактированно VirtualMan (10.01.2017 14:31:14)

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson