MySQL更新来自两个表的数据

时间:2016-04-13 09:07:45

标签: mysql

我有一个MySQL数据库,其中包含我需要修改的两个表。 第一个表格包含注释

id type note
1  1    24 months warranty
2  1    12 months warranty
3  2    Garage in Denver
4  3    Pre sales maintenance done
....

然后是一张车辆工作台,里面有许多车辆工作台和一个用文字而不是指针记录笔记的字段

id licence_plate  ... sales_notes ...
1  XH34DN         ... <warranty>24 months warranty</warranty><garage>Garage in Denver</garage><maintenance>Pre sales maintenance done</maintenance> ...
2  K4B3C6         ... <warranty>12 months warranty</warranty><garage>Garage in Sacramento</garage><maintenance>Pre sales maintenance not done</maintenance> ...

你可以想象这是非常有用的,我想修改为持有笔记id的指针。

id licence_plate  ... warranty_note garage_note maintenace_note ...
1  XH34DN         ... 1             3           4 ...
2  K4B3C6         ... 2             7           12 ...

我可以手动更新,但我想构建一个按类型自动生成的。

因此,对于notes.type = 1,如果在vehicle.sales_notes中找到notes.note文本,则更新vehicle.warranty_note。

知道怎么建这样的东西吗?

我有类似的想法,但是id不起作用。没有结果更新

UPDATE tx_vehicle v, tx_note n
SET v.garage_note = n.uid
WHERE v.sales_notes LIKE ('%'+n.note+'%')

1 个答案:

答案 0 :(得分:0)

MySQL有特殊XML parsing functions

insert into your_new_notes_table (id, licence_plate, warranty_note, garage_note, maintenace_note)
select
    sn.id,
    sn.license_plate,
    (select nt.id from notes as nt where nt.type = 1 and nt.note = ExtractValue(sn.sales_note, "/warranty")) as warranty_note,
    (select nt.id from notes as nt where nt.type = 1 and nt.note = ExtractValue(sn.sales_note, "/garage")) as garage_note,
    (select nt.id from notes as nt where nt.type = 1 and nt.note = ExtractValue(sn.sales_note, "/maintenance")) as maintenance_note
from note_types as nt

虽然如果在note_types表中找不到销售的确切记录,它将会失败。您可以调整注释文本比较,将其替换为like运算符,正则表达式检查或其他函数;你可以用完整的单词替换缩写或发明你自己的MySQL函数。此外,如果在select表中找不到注释,您可以创建自己的MySQL函数,该函数将包含内部null并返回note_types

如果您要更新现有表格,则需要update join查询与我提供的select相同的class Pointer <T> { T target = null; Pointer(T target){ this.target = target; } static Pointer nullPointer(){ return new Pointer(null); } public void setTarget(T target){ this.target = target; } public T getTarget(){ return target; } }