我有一张超过一百万行的表:
id | names
1 | sarah johnson
2 | anna smith;deborah cuoco
3 | sarah johnson;anna smith
我想执行一个返回
的查询name | occurences
sarah johnson | 2
anna smith | 2
deborah cuoco | 1
如果不是“名字”有时包含多个条目,那么它就像下面这样简单:
SELECT names, count(id) as occurences
FROM table
GROUP BY names
ORDER BY occurences DESC
但我不知道如何使用包含多个值的“名称”处理此问题,在这种情况下由半列分隔
有没有办法在单个查询中执行此操作?
答案 0 :(得分:0)
如果你在任何一行中只有一些这样的名字,你可以通过一些操作来解决它们:
SELECT substring_index(substring_index(t.names, ';', n.n), ';', -1) as name,
count(*) as occurences
FROM table t cross join
(select 1 as n union all select 2 union all select 3) n
WHERE n.n <= length(t.names) - length(replace(t.names, ';', '')) + 1
GROUP BY name
ORDER BY occurences DESC;
这将从名称字符串中提取第n个元素。 where
子句确保为具有x
元素的字符串提取唯一的x
元素(否则,最后一个元素将被覆盖)。以上内容适用于names
中最多三个名称。