背景信息:我们有一个社区房间,可以通过窗帘将其分成两半。过去,当一个团体需要整个房间时,我们会放入 2 个条目,每半个房间一个...但是我们修改了软件 (MRBS),现在有 3 个房间(完整{1},壁橱边{2 }, 和 Kitchen Side{3}),并且软件会检查您不能在整个房间已经预订时保留部分房间,反之亦然。然而,我们有很多旧的“满房”预订都是通过双方预订来完成的。因此,当 2 和 3 相同时,我需要将其中一个预订移至 1 并删除另一个。
所以我有一个表格,例如:
id room_id start_time name
1 2 13:00 Meeting
2 2 15:00 Meeting
3 3 15:00 Meeting
4 3 13:00 Storytime
我想遍历表格,当房间 2 和 3 同时具有相同名称的条目时,我想将房间 2 的 room_id 更改为 1 并删除房间 3 的条目。所以在上面示例条目 2 将被修改,条目 3 将被删除。
我相当确定这需要是两个单独的查询; EG 首先将 2 的所有 room_id 更改为 1,然后作为单独的查询,比较房间 1 和 3 并删除 3 上的条目。
我认为将房间 2 换成房间 1 很接近:
UPDATE `mrbs_entry`
JOIN `mrbs_entry` AS `other_side` ON `other_side.room_id` = '3'
AND `other_side.name` = `mrbs_entry.name`
AND `other_side.start_time` = `mrbs_entry.start_time`
AND `other_side.id` != `mrbs_entry.id`
SET `mrbs_entry.room_id` = '1'
WHERE (`mrbs_entry.room_id` = '2' AND `mrbs_entery.id` IN(92437,92438,92442,92443,92470,92471,92477,92478,92489,89462,92496,90873))
但是我得到一个#1054 - Unknown column 'mrbs_entry.room_id' in 'field list' 错误
注意:IN(*) 位是将其限制为几个测试条目,以确保它确实按预期工作。
最佳答案
方法 1 - 带临时表的存储过程
如果您准备使用存储过程和临时表,这似乎是最简单的方法:
CREATE PROCEDURE sp_sanitize_mrbs()
BEGIN
DROP TEMPORARY TABLE IF EXISTS mrbs_to_sanitize;
CREATE TEMPORARY TABLE mrbs_to_sanitize (
id int auto_increment primary key,
room2_id int,
room3_id int);
-- "I want to go through the table, and when room 2 & 3 both have
-- entries at the same time and with the same name I want to..."
INSERT INTO mrbs_to_sanitize (room2_id, room3_id)
SELECT m1.id, m2.id
FROM mrbs_entry m1
CROSS JOIN mrbs_entry m2
WHERE m1.start_time = m2.start_time
AND m1.name = m2.name
AND m1.room_id = 2
AND m2.room_id = 3;
-- ...change room 2's room_id to 1
UPDATE mrbs_entry me
JOIN mrbs_to_sanitize mts
ON me.id = mts.room2_id
SET me.room_id = 1;
-- "...and delete the entry for room 3."
DELETE me
FROM mrbs_entry me
JOIN mrbs_to_sanitize mts
ON me.id = mts.room3_id;
END//
-- ...
-- The Stored Procedure can now be called any time you like:
CALL sp_sanitize_mrbs();
参见 SQL Fiddle Demo - using a Stored Procedure
方法 2 - 没有存储过程
下面的“技巧”稍微复杂一些,但应该在不使用存储过程、临时表或变量的情况下完成:
-- "I want to go through the table, and when room 2 & 3 both have
-- entries at the same time and with the same name I want to..."
-- "...change room 2's room_id to 1"
UPDATE mrbs_entry m1
CROSS JOIN mrbs_entry m2
-- temporarily mark this row as having been updated
SET m1.room_id = 1, m1.name = CONCAT(m1.name, ' UPDATED')
WHERE m1.start_time = m2.start_time
AND m1.name = m2.name
AND m1.room_id = 2
AND m2.room_id = 3;
-- "...and delete the entry for room 3."
DELETE m2 FROM mrbs_entry m1
CROSS JOIN mrbs_entry m2
WHERE m1.start_time = m2.start_time
AND m1.name = CONCAT(m2.name, ' UPDATED')
AND m1.room_id = 1
AND m2.room_id = 3;
-- now remove the temporary marker to restore previous value
UPDATE mrbs_entry
SET name = LEFT(name, CHAR_LENGTH(name) - CHAR_LENGTH(' UPDATED'))
WHERE name LIKE '% UPDATED';
方法二的解释
第一个查询更新房间号。但是,正如您提到的,我们需要在单独的查询中执行删除。由于我没有对您的数据做出任何假设,因此在修改数据后重新查询以获得相同结果的一种安全方法是引入一个“标记”来临时指示更新更改了哪一行。 在上面的示例中,此标记是 'UPDATED ',但您可能希望选择更可能永远不会用于任何其他目的的标记,例如随机的字符序列。如果需要,它也可以移动到不同的字段。然后可以执行删除,最后需要删除标记以恢复原始数据。
关于mysql - 当操作影响集合时更新和删除一组行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34773830/
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数
我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co
2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p