0

我正在尝试构建一个包含公司所有可能值/关键字的搜索表。

桌子:

id, company_id, value
1   2           grocery store
2   3           mall something
3   2           grocery
4   2           mall

*其中 company_id 是公司表的外键。

我正在尝试查找具有特定部分值的公司 id,例如在上表中,我希望公司的值都像 '%grocery%' 和 '%mall%' ,在这种情况下,公司 2 应该返回,但公司的 id 3 不应该。我得到的关闭查询是:

select company_id from search where (value LIKE 'grocery' OR value LIKE 'mall') group by company_id having count(distinct value) = 2;

几乎对我有用,除了我需要使用 like '%grocery%' (w/ %) 来查找部分匹配项,但是如果我使用 % 运算符,查询不会给我任何结果。我相信这是因为你不能按部分匹配分组?

我将不胜感激有关如何解决此问题的任何指示或提示。

非常感谢!

4

2 回答 2

1

这就是你想要的

SELECT * FROM  (

SELECT DISTINCT company_id , value FROM (

SELECT company_id,
  CASE WHEN value LIKE '%grocery%' THEN 'grocery' WHEN value LIKE '%mall%' THEN 'mall'       END AS value FROM SEARCH
    WHERE (value LIKE '%grocery%' OR value LIKE '%mall%')
  ) a
  ) b
GROUP BY b.company_id HAVING count(*) = 2

您查询中的问题是count(distinct value)会将“grocery”和“grocery something”计为不同的记录,因此您的计数可能会超过 2。

此外,即使公司没有“商场”记录,但 2 部分包含“杂货”的记录也会出现在结果中。即使其中没​​有包含“商场”的记录

于 2013-08-14T14:37:33.790 回答
1

我相信这是因为你不能按部分匹配分组?

您不是按列“分组” value,而是按列“分组” company_id,因此这无关紧要。

having count(distinct value) = 2

我认为这里的 DISTINCT 是你的问题——这里的部分匹配可能有问题。

尝试

having count(company_id) = 2

取而代之的是(或者即使>= 2可能有更多结果并且您仍然想捕获这些公司 ID) - 将选择搜索表中包含匹配项的每一行,因此计算每个公司 ID 出现的频率应该可以解决问题。


编辑:

好的,所以问题是如果一家公司有两个命中mall, femallshopping mall,但没有grocery,你不想找到它,但只有当mall grocery至少被找到一次。

好吧,那我们试试这个方法:

SELECT
  company_id
FROM SEARCH
GROUP BY company_id
HAVING SUM(value LIKE '%grocery%') AND SUM(value LIKE '%mall%')

我们在总结找了多少次%grocery%,找了多少次%mall%。这可能导致每个关键字的值为零或更多——并且使用 HAVING 子句,我们要求这两个关键字的总和值至少为 1(零算作假,每隔一个数字算作真)。

在这里看到它:http ://sqlfiddle.com/#!2/9130e/7

这对你更有效吗?

(但请注意,此查询在大型数据集上可能不是很快。索引不会有太大帮助,因为您正在寻找部分匹配,并且 HAVING 仅在获取所有行之后才进行评估......所以这可能会让它变得相当慢,涉及使用临时表等)

于 2013-08-14T14:19:10.317 回答