你有一个糟糕的数据结构。标签应该存储在一个单独的表中,每个项目和标签一行——因此给定的行可能有 15 个标签。那么查询将非常简单。
简化查询的一种方法是使用in
:
select *
from table1 t1 join
tabl2 t2
on t1.tag1 in (t2.tag1, t2.tag3, . . . , t2.tag15) or
t1.tag2 in ( . . . ) or
. . .
我认为这甚至适用NULL
于标签中的值。
编辑:
逗号分隔的列表甚至比单独的列更糟糕。在 MySQL 中,您可以执行以下操作:
on find_in_set(substring_index(t1.tags, ',', 1), t2.tags) > 0 or
find_in_set(substring_index(substring_index(t1.tags, ',', 2), -1), t2.tags) > 0 or
find_in_set(substring_index(substring_index(t1.tags, ',', 3), -1), t2.tags) > 0 or
. . .
正确的方法是有两个表,列如下:
和
那么查询是:
select *
from table1tags t1t join
table2tags t2t
on t1t.tag = t2t.tag;
比其他选择简单得多。