2011-09-27 84 views
0

我有一張表,名爲faq。該表由字段faq_idfaq_subject組成。 我有另一個表article它由article_idticket_id,a_body組成,它將商品存儲在特定的票證中。當然,還有一張表「門票」,字段ticket_id,ticket_number基於多個表之間的動態LIKE語句的MySQL JOIN

我想檢索格式爲: ticket_numberfaq_idfaq_subject的結果表。

爲了做到這一點,我需要在article中搜索faq_id。使用%LIKE%語句的a_body字段。

我的問題是,我怎樣才能動態地做到這一點,使我返回SQL一個結果表格,格式爲ticket_numberfaq_idfaq_subject

我嘗試了UNION ALL,LEFT JOIN,LEFT OUTER JOIN聲明的多種配置,但它們都返回太多的行或者有不同的問題。

這是甚至可能與MySQL,是否有可能編寫一個SQL語句,其中包含@variables,可以照顧這一點?

回答

2

首先,這種設計是有問題的。您將某些數據嵌入到另一列中,這會導致邏輯以及性能問題(因爲您無法將a_body編入索引以幫助JOIN)。如果這是一次性的事情,那麼這是一個問題,但否則你會遇到這個設計的問題。

其次,請考慮以下示例:您正在搜索faq_id#123。你有一篇文章,其中包括faq_id 4123.你最終會在那裏發生錯誤的比賽。您可以在文本中使用某種標記嵌入faq_id值(例如,[faq_id:123]),但此時您也可以將它們保存在另一個表中。

以下查詢應該可以工作(我認爲MySQL支持CAST,如果不支持,那麼您可能需要調整它)。

SELECT 
    T.ticket_number, 
    F.faq_id, 
    F.faq_subject 
FROM 
    Articles A 
INNER JOIN FAQs F ON 
    A.a_body LIKE CONCAT('%', F.faq_id, '%') 
INNER JOIN Tickets T ON 
    T.ticket_id = A.ticket_id 

編輯:更正使用CONCAT

+0

'CAST'在這種情況下是沒有必要的,而且會在MySQL拋出一個錯誤。 – bfavaretto

+0

它報告第8行的語法錯誤。 – Cninroh

+0

我認爲這將工作,如果我以MySQL友好的方式重寫「A.a_body LIKE'%'+ CAST(F.faq_id AS VARCHAR)+'%'」。 – Cninroh

0
SELECT DISTINCT t.ticket_number, f.faq_id, f.faq_subject 
FROM faq.f 
INNER JOIN article a ON (a.a_body RLIKE CONCAT('faq_id: ',faq_id)) 
INNER JOIN ticket t ON (t.ticket_id = a.ticket_id) 
WHERE somecriteria