子查询返回超过1行LIKE&带通配符的CONCAT

时间:2014-11-05 12:43:21

标签: mysql sql wildcard concat sql-like

我有2个表,'contacts'和'job_titles'。在“联系人”表中,有一个名为“position”的字段。使用新的'job_titles'表,我想更新名为'job_title_id'的'contacts'表中的字段,如果'position'字段值类似于'job_titles'表中的'title'字段而且我来了穿越障碍。

因为位置字段是自由文本字段,所以我们可以使用以下值:

  • 此类公司的服务交付经理

另外,我们可能会在'job_titles'表的'title'字段中输入以下值:

  • 服务交付经理
  • IT服务交付经理
  • 高级服务交付经理

因此,当我运行以下查询时,我收到一个'子查询返回超过1行'错误。

UPDATE contacts 
SET job_title_id = 
  (SELECT id 
   FROM job_titles 
   WHERE job_titles.title LIKE CONCAT('%', contacts.position, '%')
  );

有没有办法可以运行像上面那样的通配符查询来完成我需要的工作?感谢。

3 个答案:

答案 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, '%')