php - 根据其他一些行创建不具有真正唯一键的 mysql 行

标签 php mysql sql

数据库示例:

| 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_idx_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/

相关文章:

asp.net - SqlDataSource动态设置SelectCommand

SQL Server 进程队列竞争条件

php - Android 应用程序连接 MySql 不工作

php - 添加固定价格项目 : Specify MPN in VariationSpecifics. 名称值列表

javascript - 如何使用ajax和php将数据库表中的数据放入html表

sql - 如何在 PostgreSQL 中有条件地查找模式

mysql - SQL - 从具有公共(public)字段的组中获取不同的记录

javascript - 基于先前选择的下拉列表根本不填充

php - 获取最近 30 天的 mysql 结果

mysql - 为什么当我尝试迁移 Thinking Sphinx 索引时 rake 任务被中止?