数据库示例:
| country | animal | size | x_id* |
|---------+--------+--------+-------|
| 777 | 1001 | small | 1 |
| 777 | 2002 | medium | 2 |
| 777 | 7007 | medium | 3 |
| 777 | 7007 | large | 4 |
| 42 | 1001 | small | 1 |
| 42 | 2002 | medium | 2 |
| 42 | 7007 | large | 4 |
我需要根据 (animal, size) 中的条目连续生成 x_id
并且如果组合 x_id
的 x_id
存在则使用它再次。
目前我使用以下 PHP 脚本执行此操作,但在大型数据库表上它非常慢。
query("UPDATE myTable SET x_id = -1");
$i = $j;
$c = array();
$q = query("
SELECT animal, size
FROM myTable
WHERE x_id = -1
GROUP BY animal, size");
while($r = fetch_array($q)) {
$hk = $r['animal'] . '-' . $r['size'];
if( !isset( $c[$hk] ) ) $c[$hk] = $i++;
query("
UPDATE myTable
SET x_id = {$c[$hk]}
WHERE animal = '".$r['animal']."'
AND size = '".$r['size']."'
AND x_id = -1");
}
有没有办法将 PHP 脚本转换为一个或两个 mysql 命令?
编辑:
CREATE TABLE `myTable` (
`country` int(10) unsigned NOT NULL DEFAULT '1', -- country
`animal` int(3) NOT NULL,
`size` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`lang_id` tinyint(4) NOT NULL DEFAULT '1',
`x_id` int(10) NOT NULL,
KEY `country` (`country`),
KEY `x_id` (`x_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
最佳答案
UPDATE myTable m
JOIN (
SELECT animal, size, @newid := @newid + 1 AS x_id
FROM myTable a
CROSS JOIN (SELECT @newid := 0) b
WHERE x_id = -1
GROUP BY animal, size
) t ON m.animal = t.animal AND m.size = t.size
SET m.x_id = t.x_id
;
http://sqlfiddle.com/#!9/5525ba/1
不需要子查询中的group by。它会产生无用的开销。如果足够快,就这样吧,否则我们可以使用 distinct+another 子查询。
关于php - 根据其他一些行创建不具有真正唯一键的 mysql 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465687/