通过比较两个不同表中的字符串来填充字段

时间:2013-06-11 06:44:48

标签: mysql

我有两个表,一个包含关键字,另一个表包含字符串值。我想添加一个列,其中将插入对第一个表id的引用。 此插入的值将基于第一行上的字符串将被采用的基础,如果它包含来自另一个表的任何关键字,并且如果找到包含在字符串中的关键字,则在此处插入该关键字的id (应包含外键约束)。

我对如何实现这一点感到困惑。应该是一个过程或触发器,因为插入后应该填充此字段。我正在尝试触发器,但我无法解决字符串函数。

我是SQL和学习的新手,所以尝试了INSTR(),但它只需要第一个关键字。

另外哪种方式最好也很快,因为两个表都包含大约10000个值。

一张桌子是含有

的运动
id - sport

其他表格是包含

的funlocater
id - countryid - tag - link - email - sportid

funlocater中的数据是手动填充的,除了应该自动填充的sportid部分。

例如。 funlocater中的一行包含

1 - 183 - skatebording competition at tawar mall - www.abcd.com/abcd?xyz - abcd@abcd.com - ???

现在,在检查关键字滑板后,如果包含在funlocater的标签栏中,sportid应该包含来自运动表的sportid。

就像INSTR('skateboarding', funlocater.tag) 但我想检查所有最匹配的值。 我如何进行匹配工作? INSTR()完成工作,但只需要一个值。我想检查是否找到关键字然后插入sports.id或者检查下一个关键字。

1 个答案:

答案 0 :(得分:1)

首先,我想说你最好规范化你的数据库模式并将映射存储在像

这样的表中
CREATE TABLE funlocater_sports 
(
    funlocater_id INT NOT NULL, 
    sports_id INT NOT NULL,
    PRIMARY KEY pk_funlocater_sports(funlocater_id, sports_id),
    FOREIGN KEY fk_funlocater(funlocater_id) REFERENCES funlocater(id),
    FOREIGN KEY fk_sports(sports_id) REFERENCES sports(id)
);

然而,你可以通过像这样的查询实现你的直接目标

UPDATE funlocater l JOIN
(
  SELECT f.id, GROUP_CONCAT(s.id) sport_ids
    FROM funlocater f JOIN sports s
      ON FIND_IN_SET(s.sport, REPLACE(f.tag, ' ', ',')) > 0
   GROUP BY f.id
) q ON l.id = q.id
   SET l.sportid = q.sport_ids

通过这种方式,您可以在sports表的sportid列中的funlocater表格中获得以逗号分隔的运动ID列表。

这是 SQLFiddle 演示

如果您想使用触发器,那么最好在像这样的函数中分解公共代码

CREATE FUNCTION tag_to_sportid(atag VARCHAR(512))
RETURNS VARCHAR(512) 
DETERMINISTIC
RETURN
  (
      SELECT GROUP_CONCAT(s.id)
        FROM (SELECT 1 id) f JOIN sports s
          ON FIND_IN_SET(s.sport, REPLACE(atag, ' ', ',')) > 0
       GROUP BY f.id
  );

然后触发

CREATE TRIGGER tg_funlocator_insert
BEFORE INSERT ON funlocater
FOR EACH ROW
  SET NEW.sportid = tag_to_sportid(NEW.tag);

CREATE TRIGGER tg_funlocator_update
BEFORE UPDATE ON funlocater
FOR EACH ROW
  SET NEW.sportid = tag_to_sportid(NEW.tag);

这是 SQLFiddle 演示