我有2个表,'contacts'和'job_titles'。在“联系人”表中,有一个名为“position”的字段。使用新的'job_titles'表,我想更新名为'job_title_id'的'contacts'表中的字段,如果'position'字段值类似于'job_titles'表中的'title'字段而且我来了穿越障碍。
因为位置字段是自由文本字段,所以我们可以使用以下值:
另外,我们可能会在'job_titles'表的'title'字段中输入以下值:
因此,当我运行以下查询时,我收到一个'子查询返回超过1行'错误。
UPDATE contacts
SET job_title_id =
(SELECT id
FROM job_titles
WHERE job_titles.title LIKE CONCAT('%', contacts.position, '%')
);
有没有办法可以运行像上面那样的通配符查询来完成我需要的工作?感谢。
答案 0 :(得分:4)
以下将匹配最短标题,假设更通用:
UPDATE contacts c
SET job_title_id = (SELECT id
FROM job_titles jt
WHERE jt.title LIKE CONCAT('%', c.position, '%')
ORDER BY char_length(jt.title)
LIMIT 1
);
答案 1 :(得分:2)
通配符查询可能会返回多条记录。因此,如果您使用具有限制1的嵌套查询,则可以使用一个解决方案。
喜欢
UPDATE contacts SET job_title_id = (SELECT id FROM job_titles WHERE job_titles.title LIKE CONCAT('%', contacts.position, '%') limit 1);
但是在这里可能会出现一个问题,即它可能会返回用于搜索服务交付的高级服务交付记录,因此如果您的字段数据以作业标题开头,那么您可以编写查询,如。
UPDATE contacts SET job_title_id = (SELECT id FROM job_titles WHERE job_titles.title LIKE CONCAT(contacts.position, '%') limit 1);
答案 2 :(得分:0)
此查询会有所帮助。
UPDATE A SET A.job_title_id = B.id FROM contacts AS A
INNER JOIN job_titles AS B ON B.id IS Not NUll
WHERE B.title LIKE CONCAT('%', A.position, '%')