全文搜索添加与其他表的关系但 returns 0 个结果

Full Text Search to add relationship to other tables but returns 0 results

我是 运行 innodb 5.6.17。我有一个 data_blocks table 和一个文本类型的列标签。我在上面启用了全文索引,这样我就可以 link 多个标签行到这一行。像这样:

tags
[16][3]
[18][3]

这些数字是指向标签 table 中标签的 ID。 data_block 可以有任意数量的标签组合。我无法从一对多关系中找到 link 的方法,因此我创建了这种格式的文本列。它工作得很好,但使用

非常慢
WHERE tags LIKE "%[16]%";

我尝试使用

使用全文搜索
SELECT * FROM data_blocks WHERE MATCH(tags) AGAINST("+[16]");

但这返回了 0 个结果。 我已经将 ft_min_word_len 减少到 3,以便搜索一个一位数字的事件,但它仍然是 returns 0.

如果我需要以完全不同的方式执行此操作,请告诉我,否则,为什么全文搜索不返回任何行?

谢谢

如果你有关系 table tags,你可以这样做:

SELECT d.*
FROM data_blocks AS d
JOIN tags AS t ON d.id = t.data_block_id
GROUP by d.id
HAVING SUM(t.tag = 16) = COUNT(*)

SUM(t.tag = 16) 是具有该标记的行数,而 COUNT(*) 是总行数。因此 HAVING 子句匹配行数与具有所选标记的行数完全相同的数据块。

tagstable应该定义为:

CREATE TABLE tags (
    tag INT,
    data_block_id INT,
    UNIQUE KEY (tag, data_block_id),
    FOREIGN KEY (data_block_id) REFERENCES data_blocks (id)
);

求和函数需要相当长的时间 table 变得更大。所以为了能够得到特定的结果并且不需要很长时间,将使用where语句减少数据集。

根据最后一个答案编辑:

SELECT d.*
FROM data_blocks AS d
JOIN tags AS t ON d.id = t.data_block_id
WHERE t.tag = 16
GROUP by d.id
HAVING COUNT(*) = 1

这样检查标签会在调用 count 或 sum 之前减少数据集。

如果您想找到带有特定标签的特定 data_block,您可以

SELECT d.*
FROM data_blocks AS d
JOIN tags AS t ON d.id = t.data_block_id
WHERE t.tag = 16 OR t.tag = 17
GROUP by d.id
HAVING COUNT(*) = 2

这确保标签只有这两个标签使用 COUNT(*) =(data_block 将拥有的标签数量)