【问题标题】:MySQL JOIN based on dynamic LIKE statement between multiple tablesMySQL JOIN 基于多表之间的动态 LIKE 语句
【发布时间】:2011-09-27 14:46:10
【问题描述】:

我有一张名为 faq 的表格。此表由字段faq_idfaq_subject 组成。 我有另一个名为 article 的表,它由 article_id,ticket_id,a_body 组成,并将文章存储在特定的票证中。自然还有一张“票”表,字段为ticket_id,ticket_number

我想检索以下格式的结果表: ticket_number,faq_id,faq_subject.

为此,我需要使用 %LIKE% 语句在 article.a_body 字段中搜索 faq_id

我的问题是,我怎样才能动态地执行此操作,以便我使用 SQL 返回一个结果表,其格式为 ticket_number,faq_id,faq_subject

我尝试了UNION ALLLEFT JOINLEFT OUTER JOIN 语句的多种配置,但它们都返回了太多行,或者有不同的问题。

这甚至可以用 MySQL 实现吗?是否可以编写一个包含 @variables 的 SQL 语句并且可以处理这个问题?

【问题讨论】:

    标签: mysql sql join sql-like


    【解决方案1】:

    首先,这种设计是有问题的。您在另一列中嵌入了某些数据,这将导致逻辑​​和性能问题(因为您无法以有助于JOIN 的方式索引a_body)。如果这是一次性的事情,那就是一个问题,否则你就会遇到这种设计的问题。

    其次,考虑这个例子:您正在搜索faq_id #123。您有一篇包含faq_id 4123 的文章。您将在那里得到一个错误匹配。您可以使用某种标记(例如,[faq_id:123])在文本中嵌入 faq_id 值,但此时您也可以将它们保存在另一个表中。

    以下查询应该可以工作(我认为 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

    【讨论】:

    • CAST 在这种情况下是不必要的,并且会在 MySQL 中抛出错误。
    • 我认为如果我以 MySQL 友好的方式重写 "A.a_body LIKE '%' + CAST(F.faq_id AS VARCHAR) + '%'" 它将起作用。
    • 您至少应该在 ID 周围使用一些标记,和/或将其保存到不同的表中,正如这个答案所暗示的那样,以避免 123 与 4123 的问题。要使查询正常工作,您应该按照 Karolis 的建议使用 CONCAT。在 MySQL 中,您不能与 + 连接,也不能与 CAST AS VARCHAR 连接 - 请参阅 CAST docs
    • 这是正确答案:SELECT T.tn, F.f_number, F.f_subject FROM article A INNER JOIN faq_item F ON A.a_body LIKE CONCAT('%', F.f_number, '% ') INNER JOIN ticket T ON T.id = A.ticket_id
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-27
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      相关资源
      最近更新 更多