【问题标题】:Need assistance with query logic需要查询逻辑方面的帮助
【发布时间】:2013-12-14 07:00:23
【问题描述】:

我已经被这个问题困住了,我不确定我应该如何提出我的查询。

我有两张表,一张是 articles,另一张是所谓的 ATC 代码

ATC 代码如下所示:N02AA59。这是一个由 7 个字符组成的完整代码。最后一个字符之前的每个字符都是一个特定的类别。因此N02A 也是一个 ATC 代码。

现在我的文章表包含的远不是所有 ATC 代码。 我想要实现的是在自动完成中使用的结果集,以这样一种方式,所有 ATC 代码子字符串(字符 1-6)应该是结果集的一部分,当且仅当它们导致文章的 ATC 代码以我的文章表中的这些字符开头。

例如,如果我在自动完成中输入“N02A”,那么应该成为结果集一部分的项目都是以“N02A”开头的 ATC 代码,因为我们有一篇文章的 ATC 代码为“N02AA59” ”。

这是基本查询,但您可能猜到,它只返回 7 字符的 ATC 代码,因为我的文章表中不存在更短的 ATC 代码:

SELECT _atc_codes.code, _atc_codes.name
FROM articles
JOIN _atc_codes
ON (_atc_codes.code LIKE 'N02A%' AND _atc_codes.id = articles.atc_code)

整个查询有一个转折点。第二列,对应的名称字段,必须是生成的 ATC 代码。所以如果我搜索“N02A”,这并不意味着每个项目都应该有 ATC 代码“N02A”的名称。

【问题讨论】:

  • 你试过SUBSTR函数吗?它可能会帮助你sql.sh/fonctions/substring
  • 使用 UNION 查询返回不同长度的 SUBSTRs。
  • 对不起,我不明白你在追求什么,但这是关于层次结构的东西,不是吗?例如,搜索 N02AB (N02A) 应该会抛出 QN02AB53(芬太尼组合,右)
  • @Strawberry 你说得对层次结构,但 N02AB 不应该匹配 QN02AB53,匹配只在右侧 (N02AB%)。
  • 好的,但是(并且看着我疯狂地超越任何我所知道的最微弱的知识)QN02AB53(Fantanyl combos)是 N02AB(苯基哌啶衍生物)的一个子类别

标签: mysql join substring


【解决方案1】:

根据您问题中的详细信息,我假设您有两个表。
表 1:_atc_codes 字段为 codename (可能更多)。
表 2:articles 字段为 atc_code 和其他字段,包括 article(不为空)。 我用这个最少的信息做了一个测试,除了一个小错误,你的查询工作正常。 在查询行 ON (_atc_codes.code LIKE 'N02A%' AND _atc_codes.id = articles.atc_code) 中,您将 _atc_codes.idarticles.atc_code
进行比较 它应该是 _atc_codes.code 而不是 _atc_codes.id

如果有关于 _atc_codes.id的其他详细信息,请发表评论> 原始帖子中缺少的内容,或者我弄错了。

【讨论】:

    【解决方案2】:

    我自己设法解决了这个问题。此查询准确地为我提供了我所追求的结果集:

    SELECT `filtered`.code AS `value`, `filtered`.en AS `name`
    FROM (SELECT _atc_codes.code, _atc_codes.en
          FROM _atc_codes
          WHERE _atc_codes.code LIKE 'N02A%') AS `filtered`
    JOIN (SELECT _atc_codes.code
          FROM articles
          JOIN _atc_codes
          ON (_atc_codes.id = articles.atc_code)
          GROUP BY articles.atc_code) AS `articles`
    WHERE articles.code LIKE CONCAT(`filtered`.code, '%')
    GROUP BY `filtered`.code
    

    关键是比较两个派生表,而不是JOIN两个完整的表。

    【讨论】:

    • 干得好 - 尽管在没有任何聚合函数的情况下,您对 GROUP BY 的使用是不合适的。也许你在寻找 DISTINCT 运算符。
    • @Strawberry 感谢您的回复。您认为GROUP BYDISTINCT 之间的区别是什么?在这种特殊情况下有什么性能提升?
    • 是的,加上 GROUP BY 可以(并且将)在选择多个列时导致不可预测的结果(在这种情况下问题较少)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    相关资源
    最近更新 更多