需要查询逻辑方面的帮助

时间:2013-11-28 09:52:08

标签: mysql join substring

我已经陷入了这个问题,我不确定应该如何实现我的查询。

我有两张表,一张包含文章,另一张包含所谓的 ATC代码

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

现在我的文章表包含了很多ATC代码。 我想要实现的是一个在自动完成中使用的结果集,以这种方式,所有ATC代码包含(char 1-6)应该是结果集的一部分,如果 - 并且只有 - 它们导致带有ATC代码的文章,以我的文章表格中的那些字符开头。

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

这是基本查询,但正如您可能猜到的,它只返回7-char 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”的名称。

2 个答案:

答案 0 :(得分:0)

根据您问题中的详细信息,我假设您有两张表。
表1: _atc_codes ,字段代码名称(可能更多)。
表2:文章,字段为 atc_code ,其他字段包括文章(非空) 。
我使用这个最小的信息进行了测试,除了一个小错误之外,您的查询仍然有效。 在查询行ON (_atc_codes.code LIKE 'N02A%' AND _atc_codes.id = articles.atc_code)中,您将 _atc_codes.id articles.atc_code 进行比较 它应该是 _atc_codes.code 而不是 _atc_codes.id
如果有关于 _atc_codes.id <的其他详细信息,请发表评论/ strong>原帖中遗漏的内容,或者我错了。

答案 1 :(得分:0)

我自己设法解决了这个问题。这个查询给了我完全相同的结果集:

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

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