Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 需要查询逻辑方面的帮助吗_Mysql_Join_Substring - Fatal编程技术网

Mysql 需要查询逻辑方面的帮助吗

Mysql 需要查询逻辑方面的帮助吗,mysql,join,substring,Mysql,Join,Substring,我陷入了这个问题,不确定该如何提出我的疑问 我有两个表格,一个是文章,另一个是所谓的ATC代码 ATC代码如下所示:N02AA59。这是由7个字符组成的完整代码。最后一个字符之前的每个字符都是特定的类别。因此,N02A也是ATC代码 现在我的文章表中包含的ATC代码远远不是所有的。 我想要实现的是一个在自动完成中使用的结果集,以这样的方式,所有子字符串(字符1-6)的ATC代码都应该是结果集的一部分,当且仅当它们导致一篇文章的ATC代码以我的文章表中的这些字符开头 例如,如果我在“自动完成”中键

我陷入了这个问题,不确定该如何提出我的疑问

我有两个表格,一个是文章,另一个是所谓的ATC代码

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

现在我的文章表中包含的ATC代码远远不是所有的。 我想要实现的是一个在自动完成中使用的结果集,以这样的方式,所有子字符串(字符1-6)的ATC代码都应该是结果集的一部分,当且仅当它们导致一篇文章的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”的名称。

根据您问题中的详细信息,我假设您有两个表。
表1:\u ATC_代码,带有字段代码和名称(可能更多) 我用这个最小的信息做了一个测试,除了一个小错误,您的查询正常。 在(_atc_code.code,如'N02A%'和_atc_code.id=articles.atc_code)上的查询行
中,您正在将\u atc_code.idarticles.atc_code

应该是\u atc\u code.code而不是\u atc\u code.id

如果原始帖子中缺少关于\u atc\u code.id的其他详细信息,或者我弄错了,请发表评论。

我已经设法自己解决了这个问题。此查询准确地给出了我要查找的结果集:

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

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

您是否尝试过使用
SUBSTR
函数?它可能会帮助您使用返回不同长度的
SUBSTR
s的查询的联合。对不起,我不明白您在追求什么,但它是关于层次结构的,不是吗?例如,搜索N02AB(N02A)应该会抛出QN02AB53(芬太尼组合,右)@草莓你关于等级的看法是对的,但N02AB不应该匹配QN02AB53,匹配只在右侧(N02AB%)。好吧,但是(当我疯狂地走出我所知甚少的任何东西时)QN02AB53(芬太尼组合)N02AB(苯基哌啶衍生物)的一个子类是否做得很好?尽管在没有任何聚合功能的情况下,您使用GROUP BY是不合适的。也许你是在找那个不同的接线员。谢谢你的答复。您认为
groupby
DISTINCT
之间有什么区别?在这种特殊情况下是否有性能提升?是的,再加上分组可以(并且将)在选择多个列时导致不可预测的结果(-在这种情况下问题较少)