我正在运行类似下面的查询:
`SELECT * FROM `table` WHERE FIND_IN_SET('1',`tags`) OR FIND_IN_SET('2',`tags`)...
是否有更简单的方法来运行查询,以确定集合中的任何数字是否与另一集合中的任何数字匹配?
例如,我想做这样的事情:
`SELECT * FROM `table` WHERE MATCH_ANY_IN_SET('1,2,7,34,45',`tags`)
答案 0 :(得分:1)
在字符串字段中包含“tags”的分隔列表并不是很好地使用像MySQL这样的关系数据库管理系统。
创建一个单独的表格会更加明智,我们称之为ThingTags
,它将现有表格中的内容与其标记相关联:
CREATE TABLE ThingTags (
ThingID INT NOT NULL,
TagID INT NOT NULL,
FOREIGN KEY (ThingID) REFERENCES `table` (ID)
);
FOREIGN KEY
约束告诉MySQL,如果ThingTags
中有相应的条目(table
),则记录只能存在于ThingTags.ThingID = table.ID
中。
因此,每个“事物”在此表中会有多条记录:
INSERT INTO ThingTags VALUES (1,1), (1,7), (1,45), (2,1), (2,34);
您的查询将如下所示:
SELECT `table`.*
FROM `table` JOIN `ThingTags` ON `ThingTags`.`ThingID` = `table`.`ID`
WHERE `ThingTags`.`TagID` IN (1,2,7,34,45);