2013-07-16 132 views
1

Table1tag1tag2tag3tag4 ...到tag15
Table2tag1tag2tag3tag4 ...到tag15比較多列多列2個表

我需要一個SQL SELECT語句來拉ANY標籤匹配的所有記錄。

通的辦法是這樣的:

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

(。每標籤)

任何有效的方式來做到這一點?

+0

我覺得225 OR語句是你唯一的方法......如果你發佈你的模式,我們可能會給你一個更好的方式來存儲你的數據。 – Orangepill

+0

你可以發佈一些樣本數據嗎?不知道數據是什麼樣子,很難嘗試找出可能的工作方式。 – andrewsi

+0

沒有有效的方式,但for循環會執行像''標記'這樣的技巧。$ i' –

回答

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

正確的做法是有兩個表中包含列:

  • Table1id
  • 標籤

而且

  • Table2id
  • 標籤

則該查詢:

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

比其他的替代品要簡單得多。

+0

我實際上簡化了我的表格(仍然不是很好的數據結構,我知道),但如果使用table1和table2,則在1個逗號分隔字段中具有標記。我如何使用IN比較table1.tags中的任何單詞與table2.tags中的任何單詞? –

+0

謝謝。我正在修改表格 –

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 

只少了很多線。