1

我正在运行类似于以下的查询:

`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`)

4

1 回答 1

2

在字符串字段中使用分隔的“标签”列表不是很好地使用关系数据库管理系统(如 MySQL)。

创建一个单独的表会更明智,我们称之为它ThingTags,它将现有表中的内容与其标签相关联:

CREATE TABLE ThingTags (
  ThingID INT NOT NULL,
  TagID   INT NOT NULL,
  FOREIGN KEY (ThingID) REFERENCES `table` (ID)
);

约束告诉 MySQL,只有在(where )中有相应的条目时,FOREIGN KEY记录才能存在。ThingTagstableThingTags.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);
于 2012-05-05T00:24:48.523 回答