2015-06-28 2 views
2

Я создал поле slug для таблицы, и они должны быть уникальными, но некоторые из них не так, я думаю, что могу добавить случайных символов в конце их, чтобы сделать их уникальными.UPDATE Таблица MySQL с предложением HAVING

Так что это мой запрос ВЫБРАТЬ:

SELECT slug,count(*) as num FROM table GROUP BY slug HAVING num > 1 

Это запрос UPDATE:

UPDATE table SET slug = CONCAT(slug,'-',SUBSTRING(MD5(NOW()),1,2)) 

мне не удалось объединить эти 2 запроса.

+2

Чтобы использовать 'HAVING', вы также должны использовать' GROUP BY slug'. В противном случае MySQL, вероятно, даст вам неправильные результаты (большинство других RDBMS сообщит об ошибке синтаксического анализа) –

+0

Ваша цель - изменить строки, возвращаемые первым запросом? –

+0

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

ответ

1

Вы можете использовать JOIN:

UPDATE mytable AS m 
JOIN (SELECT slug 
     FROM mytable 
     GROUP BY slug 
     HAVING COUNT(*) > 1) t 
ON m.slug = t.slug  
SET m.slug = CONCAT(m.slug,'-',SUBSTRING(MD5(NOW()),1,2)) 

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

Demo here

Один из способов обойти это, чтобы использовать номера строк, вычисленных переменных:

UPDATE mytable AS m 
CROSS JOIN (SELECT @row_number:=0, @slug := '') AS vars 
JOIN (
    SELECT slug 
    FROM mytable 
    GROUP BY slug 
    HAVING COUNT(*) > 1) AS t ON m.slug = t.slug  
SET m.slug = CONCAT(m.slug, 
        '-', 
        IF (@slug = m.slug, 
         IF (@slug := m.slug,@row_number:[email protected]_number+1, 
              @row_number:[email protected]_number+1), 
         IF (@slug := m.slug, @row_number:=1, 
               @row_number:=1)) 
        ) 

Demo here

+0

Ваше второе предложение решило мою проблему, спасибо. –

0

Try:

UPDATE t , 
( SELECT slug FROM t 
    GROUP BY slug HAVING count(*) > 1 
) x 
SET t.slug = CONCAT(t.slug,'-',SUBSTRING(MD5(rand()),1,2)) 
WHERE t.slug = x.slug 
; 

Демо: http://sqlfiddle.com/#!9/01c68/1

Я использую rand() вместо now(), потому что последний не даст уникальных строк.

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