查询以计算ID出现在字符串中的次数

时间:2014-01-31 11:59:25

标签: mysql sql

甚至不确定这个,这可能是我无法立即想到解决方案的原因,但是......

我有一个商店位置表和第二个表,这些数据记录了“找到我最近的商店”类型搜索中出现的商店。

因此,例如,表A具有此内容

ID | Store_Name
1  | London
2  | Edinburgh
3  | Bristol
4  | Crawley
5  | Brighton
6  | Cambridge

当用户进行搜索时,生成的商店ID会像这样保存在统计信息表中(有更多列,但保持这个简单)

ID | Search_Results
1  | 1,4,5,6

这表明访客搜索结果已经拉升了伦敦,克劳利,布莱顿和剑桥。

现在我要做的是从这些数据中提取有用的统计数据,以及查找每个商店在搜索结果中出现的次数。我玩这个,但它显然不起作用(我可以看到原因,但你可能会看到我困惑的思考过程):

SELECT COUNT(ID) as Total, ID, Store_Name FROM a WHERE id IN (SELECT Search_Results FROM b) group by ID

我要做的是获取一个记录集,告诉我商店的ID,商店名称以及它在搜索结果中出现的次数。

MySQL大师,你怎么看?

3 个答案:

答案 0 :(得分:2)

stats表的格式非常差。您应该为“StatsIds”设置第二个表。

以下是表达您的加入的方式:

SELECT COUNT(a.ID) as Total, a.ID, a.Store_Name
FROM a join
     b
     on find_in_set(a.id, b.Search_Results) > 0
group by a.ID;

不幸的是,无法使用索引优化此查询。

答案 1 :(得分:0)

我能想到的一个选择是:

SELECT stores.id, stores.name, (SELECT count(*)
FROM stats
WHERE stats.search_results like '%' | stores.id | '%') hit_count
FROM stores

我没有数据库可以尝试这个,但我认为这应该可行

答案 2 :(得分:0)

试试这个,

SELECT (SELECT count(t.`ID`) 
        FROM stats t 
        WHERE t.Search_Results REGEXP '[[:<:]]' | s.ID | '[[:>:]]') AS search_count,s.ID,s.Store_Name 
FROM store s

您可以按照fiddle

进行检查