1

Table1tag1, tag2, …まで, tag3, …まで_ _tag4tag15
Table2tag1tag2tag3tag4tag15

ANY タグが一致するすべてのレコードを取得するには、SQL 選択ステートメントが必要です。

トングウェイは次のようになります。

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

(タグごとに。)

これを行う効率的な方法はありますか?

4

2 に答える 2

2

お粗末なデータ構造があります。タグは、アイテムとタグごとに 1 つの行を持つ別のテーブルに格納する必要があります。したがって、特定の行には 15 個のタグが含まれる場合があります。その後、クエリは非常に単純になります。

クエリを簡素化する 1 つの方法は、次を使用すること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
   . . .

正しい方法は、次のような列を持つ 2 つのテーブルを用意することです。

  • Table1id
  • 鬼ごっこ

  • Table2id
  • 鬼ごっこ

次に、クエリは次のとおりです。

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 に答える