【发布时间】:2015-12-25 19:22:26
【问题描述】:
数据库示例:
| 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 |
我需要根据(动物,大小)中的条目连续生成x_id,如果x_id 组合x_id 存在,请再次使用它。
目前我使用以下 PHP 脚本执行此操作,但在大型 db 表上它非常慢。
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;
【问题讨论】:
-
创建一个容纳动物和大小的表格。使用它来支持有问题的表格。这是一个提示
-
@Drew 我知道这是正确的方法,但是我无法更改此数据库表,复杂性远高于这个小示例
-
我可以帮助你,但它会令人难以置信的混乱,你说你不能改变架构。所以我。为什么吹20分钟就可以了。这对任何人都没有用:P
-
我无法更改行或拆分表格,但我可以添加索引或其他内容
-
感谢 Drew、Sebas 和 Mihai - 干得好!