你有一個糟糕的數據結構。標籤應該存儲在一個單獨的表格中,每個項目和標籤都有一行 - 因此給定的行可能有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;
比其他的替代品要簡單得多。
我覺得225 OR語句是你唯一的方法......如果你發佈你的模式,我們可能會給你一個更好的方式來存儲你的數據。 – Orangepill
你可以發佈一些樣本數據嗎?不知道數據是什麼樣子,很難嘗試找出可能的工作方式。 – andrewsi
沒有有效的方式,但for循環會執行像''標記'這樣的技巧。$ i' –