2011-09-27 86 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