使用 HAVING 子句更新 MySQL table
UPDATE MySQL table with HAVING clause
我为 table 创建了 slug 字段,它们需要是唯一的,但其中一些不是,所以我想我可以在它们的末尾添加随机字符以使其唯一。
所以这是我的 SELECT 查询:
SELECT slug,count(*) as num FROM table GROUP BY slug HAVING num > 1
这是更新查询:
UPDATE table SET slug = CONCAT(slug,'-',SUBSTRING(MD5(NOW()),1,2))
我无法合并这 2 个查询。
您可以使用 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))
但是上面的问题是它不会生成唯一的字符串值。
解决这个问题的一种方法是使用由变量计算的行号:
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:=@row_number+1,
@row_number:=@row_number+1),
IF (@slug := m.slug, @row_number:=1,
@row_number:=1))
)
尝试:
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()
因为后者不会提供唯一的字符串。
我为 table 创建了 slug 字段,它们需要是唯一的,但其中一些不是,所以我想我可以在它们的末尾添加随机字符以使其唯一。
所以这是我的 SELECT 查询:
SELECT slug,count(*) as num FROM table GROUP BY slug HAVING num > 1
这是更新查询:
UPDATE table SET slug = CONCAT(slug,'-',SUBSTRING(MD5(NOW()),1,2))
我无法合并这 2 个查询。
您可以使用 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))
但是上面的问题是它不会生成唯一的字符串值。
解决这个问题的一种方法是使用由变量计算的行号:
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:=@row_number+1,
@row_number:=@row_number+1),
IF (@slug := m.slug, @row_number:=1,
@row_number:=1))
)
尝试:
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()
因为后者不会提供唯一的字符串。