我試圖創建一個SELECT查詢,它通過LEFT JOIN
合併3個表,然後MATCH
特定關鍵字AGAINST
生成的表。使用兩個LEFT JOIN,MATCH AGAINST和FULLTEXT索引創建有效的MySQL查詢
到目前爲止,我的測試表明查詢工作正常,輸出結果正確,但是當通過LEFT JOIN
連接表時,我對FULLTEXT索引有疑問。
問題是 - 我應該添加額外的代碼來反映MATCH AGAINST
在執行LEFT JOIN
時的FULLTEXT
索引要求,或者只有原始表中相關列的正確索引足夠了嗎?
詢問的原因是this post。如果我理解它正確,我的代碼不應該工作(因爲「你無法在MySQL中的多個表中定義全文索引...」)。因爲它們沒有索引(或本我如何理解它,糾正我,如果我錯了:))因此MATCH AGAINST
爲ma.name_url
和v.model
,是行不通的。
然而,作爲查詢輸出似乎是正確的,我需要的專家建議,如果下面的代碼是正確的,或者我應該添加/修改的東西:
SELECT v.*, vt.color, ma.*
FROM tbl_items AS v
LEFT JOIN tbl_options
AS vt on v.id = vt.v_id
LEFT JOIN tbl_names
AS ma on v.make = ma.id
WHERE
(
(
MATCH (ma.name_url) AGAINST ('keyword1' IN BOOLEAN MODE)
OR MATCH (v.model) AGAINST ('keyword1' IN BOOLEAN MODE)
)
AND
(
MATCH (ma.name_url) AGAINST ('keyword2' IN BOOLEAN MODE)
OR MATCH (v.model) AGAINST ('keyword2' IN BOOLEAN MODE)
)
)
AND v.type = 4
所以,我已經正確定義的索引和全文索引在'MATCH AGAINST'是罰款中使用的列的事實呢?例如,如果我在'tbl_names'的'name_url'上沒有'FULLTEXT'索引會怎麼樣?看起來這不影響輸出?另外,是的,我首先加入所有的'ma'行,然後我執行一個'MATCH'來查找哪些行符合條件。 – user3132858
@ user3132858。 。 。布爾搜索不需要FULLTEXT,儘管它慢得多。我的觀點是,所有的過濾都可以在'v'上,而不是在'ma'上,所以你將有'ma'行都不符合條件。 –
感謝您的幫助......所以基本上你是說如果我有一個關鍵字只匹配一個'ma'行,該行將不會在查詢結果中?我試過了,只搜索一個包含在'ma'中的一個關鍵字,結果如預期的那樣... – user3132858