基于多表间动态LIKE语句的MySQL连接
我有一个名为“常见问题解答”的表格。此表由以下字段组成:基于多表间动态LIKE语句的MySQL连接,mysql,sql,join,sql-like,Mysql,Sql,Join,Sql Like,我有一个名为“常见问题解答”的表格。此表由以下字段组成:faq\u id,faq\u subject。 我有另一个名为article的表,它包括article\u id,ticket\u id,一个body,并将文章存储在特定的票据中。当然,还有一个表“ticket”,其中包含字段ticket\u id,ticket\u number 我想以以下格式检索结果表: ticket\u number,faq\u id,faq\u subject 为此,我需要使用%LIKE%语句在文章正文字段中搜索fa
faq\u id
,faq\u subject
。
我有另一个名为article
的表,它包括article\u id
,ticket\u id
,一个body
,并将文章存储在特定的票据中。当然,还有一个表“ticket”,其中包含字段ticket\u id
,ticket\u number
我想以以下格式检索结果表:
ticket\u number
,faq\u id
,faq\u subject
为此,我需要使用%LIKE%语句在文章
正文
字段中搜索faq\u id
我的问题是,如何动态地执行此操作,以便使用SQL返回一个结果表,其格式为ticket\u number
,faq\u id
,faq\u subject
我尝试了UNION ALL
、LEFT JOIN
、LEFT OUTER JOIN
语句的多种配置,但它们都返回了太多行,或者存在不同的问题
MySQL也可以这样做吗?是否可以编写一个包含@variables的SQL语句来处理这个问题?首先,这种设计是有问题的。您在另一列中嵌入了某些数据,这将导致逻辑和性能问题(因为您无法以有助于
加入的方式对a\u body
进行索引)。如果这是一次性的事情,那么这是一个问题,但除此之外,这个设计会有问题
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
第二,考虑这个例子:你正在搜索<代码> FQQuID 123。您有一篇文章包含
faq\u id
4123。你最终会得到一个错误的匹配。您可以在文本中嵌入带有某种标记的faq\u id
值(例如,[faq\u id:123]
),但此时您也可以将它们保存在另一个表中
下面的查询应该可以工作(我认为MySQL支持CAST
,如果不支持,那么您可能需要调整它)
编辑:更正为使用CONCAT
首先,这种设计是有问题的。您在另一列中嵌入了某些数据,这将导致逻辑和性能问题(因为您无法以有助于加入的方式对a\u body
进行索引)。如果这是一次性的事情,那么这是一个问题,但除此之外,这个设计会有问题
第二,考虑这个例子:你正在搜索<代码> FQQuID 123。您有一篇文章包含
faq\u id
4123。你最终会得到一个错误的匹配。您可以在文本中嵌入带有某种标记的faq\u id
值(例如,[faq\u id:123]
),但此时您也可以将它们保存在另一个表中
下面的查询应该可以工作(我认为MySQL支持CAST
,如果不支持,那么您可能需要调整它)
EDIT:更正为使用CONCAT
CAST
在这种情况下是不必要的,并且会在MySQL中引发错误。我认为如果我以MySQL友好的方式重写“A.A_body LIKE“%”+CAST(F.faq_id AS VARCHAR)+“%”,它会起作用。您至少应该在id周围使用一些标记,并/或将其保存到另一个表中,正如这个答案所暗示的,要避免123对4123的问题。要使查询正常工作,您应该按照Karolis的建议使用CONCAT
。在MySQL中,您不能与+
连接,也不能将转换为VARCHAR
-请看这是正确的答案:从A.A_主体上的文章A内部连接faq_项F中选择t.tn、F.F_编号、F.F_主题,如CONCAT(“%,F.F_编号,%”)T.id=A.ticket\u idCAST上的内部连接ticket T在这种情况下是不必要的,并且会在MySQL中引发错误。我认为如果我以MySQL友好的方式重写“A.A\u body LIKE“%”+CAST(F.faq\u id AS VARCHAR)+“%”,它会起作用。您至少应该在id周围使用一些标记,并/或将其保存到另一个表中,正如这个答案所暗示的,要避免123对4123的问题。要使查询正常工作,您应该按照Karolis的建议使用CONCAT
。在MySQL中,您不能与+
连接,也不能将转换为VARCHAR
-请看这是正确的答案:从文章A中选择t.tn、F.F_编号、F.F_主题A.A_主体上的内部联接常见问题解答项F,如CONCAT(“%”,F.F_编号,“%”)t.id上的内部联接票证t=A.ticket id
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