基于多表间动态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 id
CAST上的内部连接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