甚至不确定这个,这可能是我无法立即想到解决方案的原因,但是......
我有一个商店位置表和第二个表,这些数据记录了“找到我最近的商店”类型搜索中出现的商店。
因此,例如,表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大师,你怎么看?
答案 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
进行检查