GVKun编程网logo

在 MySQL 的一个查询中更新具有不同值的多行

16

本文将分享在MySQL的一个查询中更新具有不同值的多行的详细内容,此外,我们还将为大家带来关于MySQL如何找到在特定列中具有不同值的列的重复项?、MySQL-在一个查询中更新具有不同值的多行、mys

本文将分享在 MySQL 的一个查询中更新具有不同值的多行的详细内容,此外,我们还将为大家带来关于MySQL 如何找到在特定列中具有不同值的列的重复项?、MySQL-在一个查询中更新具有不同值的多行、mysql批量更新多条记录的同一个字段为不同值的方法、MYSQL数据库mysql批量更新多条记录的同一个字段为不同值的方法的相关知识,希望对你有所帮助。

本文目录一览:

在 MySQL 的一个查询中更新具有不同值的多行

在 MySQL 的一个查询中更新具有不同值的多行

我试图了解如何更新具有不同值的多行,但我只是不明白。解决方案无处不在,但对我来说似乎很难理解。

例如,三个更新为 1 个查询:

UPDATE table_usersSET cod_user = ''622057''    , date = ''12082014''WHERE user_rol = ''student''    AND cod_office = ''17389551'';UPDATE table_usersSET cod_user = ''2913659''    , date = ''12082014''WHERE user_rol = ''assistant''    AND cod_office = ''17389551'';UPDATE table_usersSET cod_user = ''6160230''    , date = ''12082014''WHERE user_rol = ''admin''    AND cod_office = ''17389551'';

我读了一个例子,但我真的不明白如何进行查询。IE:

UPDATE table_to_updateSET cod_user= IF(cod_office = ''17389551'',''622057'',''2913659'',''6160230'')    ,date = IF(cod_office = ''17389551'',''12082014'')WHERE ?? IN (??) ;

如果 WHERE 和 IF 条件中有多个条件,我不完全清楚如何进行查询..有什么想法吗?

答案1

小编典典

你可以这样做:

UPDATE table_users    SET cod_user = (case when user_role = ''student'' then ''622057''                         when user_role = ''assistant'' then ''2913659''                         when user_role = ''admin'' then ''6160230''                    end),        date = ''12082014''    WHERE user_role in (''student'', ''assistant'', ''admin'') AND          cod_office = ''17389551'';

我不明白你的日期格式。日期应使用本地日期和时间类型存储在数据库中。

MySQL 如何找到在特定列中具有不同值的列的重复项?

MySQL 如何找到在特定列中具有不同值的列的重复项?

如何解决MySQL 如何找到在特定列中具有不同值的列的重复项??

我有一张包含以下内容的表格:

ID|NAME|KEY
0 |A   |0x00 OK
1 |B   |0x01 OK
2 |A   |0x03 <<< DUP with different KEY 
3 |A   |0x00 OK
4 |A   |0x00 OK

如您所见,我有重复的“A”,但其中只有一个具有不同的密钥。 我希望通过 MysqL 查询在数据中找到它们。

获取具有不同 KEYS 的 NAME 重复项的查询是什么?

换句话说:

仅当密钥不同时才查找重复名称

解决方法

  • 这将通过按列名称和键对它们进行分组来为您提供所有唯一名称和键组合。
  • 这是通过创建 N 级组来实现的,在我们的例子中,N = 2 表示名称上的第一级组和键上的第二级组。
  • 此处演示 -> https://www.db-fiddle.com/f/x4KjTdq5p9SEh94BThMdPg/6
with a as (
  select distinct name,my_key
  from some_table
)
select * from a
where name in (
  select name 
  from a 
  group by name 
  having count(1) > 1
)
group by name,my_key;
,

答案如下:

select name,my_key 
from some_table 
where name in (select name from some_table group by name having count(1)>1) 
AND my_key not in (select my_key from some_table group by my_key having count(1)>
group by name,my_key;

在这里测试: https://www.db-fiddle.com/f/x4KjTdq5p9SEh94BThMdPg/5

,

我会分别为 COUNT()name 使用 my_key 窗口函数,并根据它们的结果进行过滤:

SELECT name,my_key
FROM (
  SELECT *,COUNT(*) OVER (PARTITION BY name) count_name,COUNT(*) OVER (PARTITION BY my_key) count_key
  FROM some_table 
) t
WHERE count_name > 1 AND count_key = 1

参见demo。

,

你可以试试:

SELECT * FROM `table` WHERE `name` = ''A'' AND `key` != ''0x00''

MySQL-在一个查询中更新具有不同值的多行

MySQL-在一个查询中更新具有不同值的多行

我试图了解如何用不同的值更新多行,但我不明白。解决方案无处不在,但对我来说似乎很难理解。

例如,将三个更新更新为1个查询:

UPDATE table_users
SET cod_user = '622057',date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '17389551';

UPDATE table_users
SET cod_user = '2913659',date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '17389551';

UPDATE table_users
SET cod_user = '6160230',date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '17389551';

我读了一个例子,但我真的不明白如何进行查询。即:

UPDATE table_to_update
SET cod_user= IF(cod_office = '17389551','622057','2913659','6160230'),date = IF(cod_office = '17389551','12082014')
WHERE ?? IN (??) ;

如果在WHERE和IF条件中存在多个条件,我还不太清楚如何执行查询。

mysql批量更新多条记录的同一个字段为不同值的方法

mysql批量更新多条记录的同一个字段为不同值的方法

如何用一条sql语句实现批量更新?mysql并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现。很多人的想法如下

首先mysql更新数据的某个字段,一般这样写:

1

UPDATE mytable SET myfield = ''value'' WHERE other_field = ''other_value'';

也可以这样用in指定要更新的记录:

1

UPDATE mytable SET myfield = ''value'' WHERE other_field in (''other_values'');

这里注意 ‘other_values'' 是一个逗号(,)分隔的字符串,如:1,2,3

如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:

?

1

2

3

4

foreach ($values as $id => $myvalue) {

 $sql = "UPDATE mytable SET myfield = $myvalue WHERE id = $id";

 mysql_query($sql);

}

即是循环一条一条的更新记录。一条记录update一次,这样性能很差,也很容易造成阻塞。

 

复制代码 代码如下:

UPDATE mytable SET 
myfield = CASE id 
        WHEN 1 THEN ''value''
        WHEN 2 THEN ''value''
        WHEN 3 THEN ''value''
END 
WHERE id IN (1,2,3);

这里使用了case when 这个小技巧来实现批量更新。

举个例子:

复制代码 代码如下(更新单个字段):

UPDATE categories SET 
display_order = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
END
WHERE id IN (1,2,3);

这句sql的意思是,更新display_order 字段,如果id=1 则display_order 的值为3,如果id=2 则 display_order 的值为4,如果id=3 则 display_order 的值为5。 
即是将条件语句写在了一起。 
这里的where部分不影响代码的执行,但是会提高sql执行的效率。确保sql语句仅执行需要修改的行数,这里只有3条数据进行更新,而where子句确保只有3行数据执行。

如果更新多个值的话,只需要稍加修改:

复制代码 代码如下(更新多个字段):

UPDATE categories SET 
display_order = CASE id 
        WHEN 1 THEN 3 
        WHEN 2 THEN 4 
        WHEN 3 THEN 5 
END, 
title = CASE id 
        WHEN 1 THEN ''New Title 1''
        WHEN 2 THEN ''New Title 2''
        WHEN 3 THEN ''New Title 3''
END
WHERE id IN (1,2,3);

到这里,已经完成一条mysql语句更新多条记录了。但是要在业务中运用,需要结合服务端语言,这里以php为例,构造这条mysql语句:

复制代码 代码如下:

$display_order = array( 
    1 => 4, 
    2 => 1, 
    3 => 2, 
    4 => 3, 
    5 => 9, 
    6 => 5, 
    7 => 8, 
    8 => 9 
); 

$ids = implode('','', array_keys($display_order)); 
$sql = "UPDATE categories SET display_order = CASE id "; 
foreach ($display_order as $id => $ordinal) { 
    $sql .= sprintf("WHEN %d THEN %d ", $id, $ordinal); 
} 
$sql .= "END WHERE id IN ($ids)"; 
echo $sql;

MYSQL数据库mysql批量更新多条记录的同一个字段为不同值的方法

MYSQL数据库mysql批量更新多条记录的同一个字段为不同值的方法

《MysqL数据库MysqL批量更新多条记录的同一个字段为不同值的方法》要点:
本文介绍了MysqL数据库MysqL批量更新多条记录的同一个字段为不同值的方法,希望对您有用。如果有疑问,可以联系我们。

首先MysqL更新数据的某个字段,一般这样写:MysqL数据库

UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';

也可以这样用in指定要更新的记录:MysqL数据库

UPDATE mytable SET myfield = 'value' WHERE other_field in ('other_values');

这里注意 ‘other_values' 是一个逗号(,)分隔的字符串,如:1,2,3MysqL数据库

如果更新多条数据而且每条记录要更新的值不同,可能很多人会这样写:MysqL数据库

foreach ($values as $id => $myvalue) {
 $sql = "UPDATE mytable SET myfield = $myvalue WHERE id = $id";
 MysqL_query($sql);
}

即是循环一条一条的更新记录.一条记录update一次,这样性能很差,也很容易造成阻塞.MysqL数据库

那么能不能一条sql语句实现批量更新呢?MysqL数据库

MysqL并没有提供直接的方法来实现批量更新,但是可以用点小技巧来实现.MysqL数据库

UPDATE mytable
 SET myfield = CASE id
 WHEN 1 THEN 'myvalue1'
 WHEN 2 THEN 'myvalue2'
 WHEN 3 THEN 'myvalue3'
 END
WHERE other_field ('other_values')

如果where条件查询出记录的id不在CASE范围内,myfield将被设置为空.MysqL数据库

如果更新多个值的话,只需要稍加修改:MysqL数据库

UPDATE mytable
 SET myfield1 = CASE id
 WHEN 1 THEN 'myvalue11'
 WHEN 2 THEN 'myvalue12'
 WHEN 3 THEN 'myvalue13'
 END,myfield2 = CASE id
 WHEN 1 THEN 'myvalue21'
 WHEN 2 THEN 'myvalue22'
 WHEN 3 THEN 'myvalue23'
 END
WHERE id IN (1,3)

这里以PHP为例,构造这两条MysqL语句:MysqL数据库

1、更新多条单个字段为不同值,MysqL模式
MysqL数据库

$ids_values = array(
 1 => 11,2 => 22,3 => 33,4 => 44,5 => 55,6 => 66,7 => 77,8 => 88,);
 
$ids = implode(',',array_keys($ids_values ));
$sql = "UPDATE mytable SET myfield = CASE id ";
foreach ($ids_values as $id=> $myvalue) {
 $sql .= sprintf("WHEN %d THEN %d ",$id,$myvalue);
}
$sql .= "END WHERE id IN ($ids)";
echo $sql.";<br/>";

输出:MysqL数据库

UPDATE mytable SET myfield = CASE id WHEN 1 THEN 11 WHEN 2 THEN 22 WHEN 3 THEN 33 WHEN 4 THEN 44 WHEN 5 THEN 55 WHEN 6 THEN 66 WHEN 7 THEN 77 WHEN 8 THEN 88 END WHERE id IN (1,3,4,5,6,7,8);

2、更新多个字段为不同值,PDO模式
MysqL数据库

$data = array(array('id' => 1,'myfield1val' => 11,'myfield2val' => 111),array('id' => 2,'myfield1val' => 22,'myfield2val' => 222));
$where_in_ids = implode(',array_map(function($v) {return ":id_" . $v['id'];},$data));
$update_sql = 'UPDATE mytable SET';
$params = array();
$update_sql .= ' myfield1 = CASE id';
foreach($data as $key => $item) {
 $update_sql .= " WHEN :id_" . $key . " THEN :myfield1val_" . $key . " ";
 $params[":id_" . $key] = $item['id'];
 $params[":myfield1val_" . $key] = $item['myfield1val'];
}
$update_sql .= " END";
$update_sql .= ',myfield2 = CASE id';
foreach($data as $key => $item) {
 $update_sql .= " WHEN :id_" . $key . " THEN :myfield2val_" . $key . " ";
 $params[":id_" . $key] = $item['id'];
 $params[":myfield1va2_" . $key] = $item['myfield2val'];
}
$update_sql .= " END";
$update_sql .= " WHERE id IN (" . $where_in_ids . ")";
echo $update_sql.";<br/>";
var_dump($params);

输出:MysqL数据库

UPDATE mytable SET myfield1 = CASE id WHEN :id_0 THEN :myfield1val_0 WHEN :id_1 THEN :myfield1val_1 END,myfield2 = CASE id WHEN :id_0 THEN :myfield2val_0 WHEN :id_1 THEN :myfield2val_1 END WHERE id IN (:id_1,:id_2);
array (size=6)
 ':id_0' => int 1
 ':myfield1val_0' => int 11
 ':id_1' => int 2
 ':myfield1val_1' => int 22
 ':myfield1va2_0' => int 111
 ':myfield1va2_1' => int 222

另外三种批量更新方式MysqL数据库

1. replace into 批量更新MysqL数据库

replace into mytable(id,myfield) values (1,'value1'),(2,'value2'),(3,'value3');

2. insert into ...on duplicate key update批量更新MysqL数据库

insert into mytable(id,myfield1,myfield2) values (1,'value11','value21'),'value12','value22'),'value13','value23') on duplicate key update myfield1=values(myfield2),values(myfield2)+values(id);

3. 临时表MysqL数据库

DROP TABLE IF EXISTS `tmptable`;
create temporary table tmptable(id int(4) primary key,myfield varchar(50));
insert into tmptable values (1,'value3');
update mytable,tmptable set mytable.myfield = tmptable.myfield where mytable.id = tmptable.id;
  1. 【replace into】和【insert into】更新都依赖于主键或唯一值,并都可能造成新增记录的操作的结构隐患
  2. 【replace into】操作本质是对重复记录先delete然后insert,如果更新的字段不全缺失的字段将被设置成缺省值
  3. 【insert into】则只是update重复的记录,更改的字段只能依循公式值
  4. 【临时表】方式需要用户有temporary 表的create 权限
  5.  数量较少时【replace into】和【insert into】性能最好,数量大时【临时表】最好,【CASE】则具有通用型也不具结构隐患

总结MysqL数据库

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流.MysqL数据库

今天关于在 MySQL 的一个查询中更新具有不同值的多行的介绍到此结束,谢谢您的阅读,有关MySQL 如何找到在特定列中具有不同值的列的重复项?、MySQL-在一个查询中更新具有不同值的多行、mysql批量更新多条记录的同一个字段为不同值的方法、MYSQL数据库mysql批量更新多条记录的同一个字段为不同值的方法等更多相关知识的信息可以在本站进行查询。

本文标签: