2017-02-16 79 views
1

我想拉tableA(profiles.category)1行匹配tableB(projects.categorysecond)1行但結果。SQL/PHP的find_in_set

*重要的projects.categorysecond將有不同的只有1個類別與幾個類別取消;例子:渥太華或渥太華;多倫多;蒙特利爾或渥太華;蒙特利爾或多倫多;蒙特利爾

profiles.category總是隻有1個類別,永遠不會刪除。

我需要確保無論我是否有OTTAWA或OTTAWA; TORONTO; MONTREAL在profiles.category中,只要匹配1個單詞就可以得到PULLS結果。

我目前正試圖下面的查詢:

SELECT p.*, up.* FROM users_profiles up INNER JOIN projects p ON find_in_set(up.category, p.categorysecond) > 0 

回答

1

FIND_IN_SET()既懂逗號作爲分隔符。閱讀https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_find-in-set

所以,你可以用,替代;然後做比較:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN projects p 
    ON FIND_IN_SET(up.category, REPLACE(p.categorysecond, ';', ',')) > 0 

我有評論說,這是不是如果你想寫發現個別語詞來存儲數據的好方法在分號分隔的字符串中。請參閱my answer to Is storing a delimited list in a database column really that bad?

您應該在project_categories表中存儲每行一個項目類別。然後將查詢會更容易些:

SELECT p.*, up.* 
FROM users_profiles up 
INNER JOIN project_categories pc 
    ON up.category = pc.category 
INNER JOIN projects p 
    ON p.project = pc.project; 

隨着project_categories(category,project)一個複合索引,此查詢應該優化得很好。

+1

哇,現在我覺得啞巴。非常感謝你。我不知道它只能理解逗號。另外,感謝您提供關於如何更好地查詢/表的更多建議。 – SiREKT