1

Table1tag1, tag2, tag3, tag4...tag15
Table2tag1, tag2, tag3,tag4 … 到tag15

我需要一个 SQL 选择语句来提取任何标签匹配的所有记录。

通方式是这样的:

SELECT table1.*
WHERE table1.tag1 = table2.tag1
   OR table1.tag1 = table2.tag2
   OR table1.tag1 = table2.tag3

(对于每个标签。)

有什么有效的方法来做到这一点?

4

2 回答 2

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
   . . .

正确的方法是有两个表,列如下:

  • 表 1id
  • 标签

  • 表2id
  • 标签

那么查询是:

select *
from table1tags t1t join
     table2tags t2t
     on t1t.tag = t2t.tag;

比其他选择简单得多。

于 2013-07-16T18:34:03.157 回答
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

只有少了很多行。

于 2013-07-17T10:08:51.093 回答