Table1
有tag1
,tag2
,tag3
,tag4
...到tag15
Table2
有tag1
,tag2
,tag3
,tag4
...到tag15
我需要一个SQL select语句来提取所有标记匹配的记录。
Tong方式会是这样的:
SELECT table1.*
WHERE table1.tag1 = table2.tag1
OR table1.tag1 = table2.tag2
OR table1.tag1 = table2.tag3
(对于每个标签。)
有效的方法吗?
答案 0 :(得分:2)
你有一个糟糕的数据结构。标签应存储在单独的表中,每个项目和标签一行 - 因此给定的行可能有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;
比其他替代方案简单得多。
答案 1 :(得分:0)
使用IN运算符。
SELECT table1.* FROM table1
JOIN table2
WHERE table1.tag1 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
table1.tag2 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
table1.tag3 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15) OR
...
...
table1.tag15 IN (table2.tag1,table2.tag2,table2.tag3...table2.tag15)
与说
相同WHERE
table1.tag1 = table2.tag1 OR
table1.tag1 = table2.tag2 OR
...
table1.tag2 = table2.tag2 OR
...
table1.tag2 = table2.tag15 OR
...
table1.tag15 = table2.tag15
只少了很多行。