我有两个表,一个包含关键字,另一个表包含字符串值。我想添加一个列,其中将插入对第一个表id的引用。 此插入的值将基于第一行上的字符串将被采用的基础,如果它包含来自另一个表的任何关键字,并且如果找到包含在字符串中的关键字,则在此处插入该关键字的id (应包含外键约束)。
我对如何实现这一点感到困惑。应该是一个过程或触发器,因为插入后应该填充此字段。我正在尝试触发器,但我无法解决字符串函数。
我是SQL和学习的新手,所以尝试了INSTR(),但它只需要第一个关键字。
另外哪种方式最好也很快,因为两个表都包含大约10000个值。
一张桌子是含有
的运动id - sport
其他表格是包含
的funlocaterid - 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或者检查下一个关键字。
答案 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 演示