mysql - 计算整个集合数据库中唯一元素的数量

标签 mysql

我有以下用户数据库,每个用户都可以说不同级别的不同语言。

id      langs
12      EN-21
36      EN-2,RU-3
41      EN-9
57      DE-35,EN-28
60      DE-9,RU-14

我想创建 MySQL 查询来计算每种语言的出现次数不管其级别。 所需的选项卡应如下所示:

lang    count
EN      4
DE      2
RU      2

我已经尝试了不同的组合,但它远非完美。

SELECT 
    DISTINCT SUBSTRING_INDEX(langs, '-', 1) AS lang, 
--  COUNT(langs) as count
--  SUM(
--      (SELECT DISTINCT SUBSTRING_INDEX(langs, '-', 1) 
--      FROM people
--      WHERE langs != '')
--  )
FROM people
WHERE langs != ''
--  GROUP BY lang
ORDER BY lang

最佳答案

如果集合中的语言数量有最大限制,你可以把第一个元素、第二个元素、第三个元素等都拉出来,并把它们联合在一起。这是一个从语言集中提取任何第一个或第二个元素并将它们组合起来的示例:

select distinct substring_index(langs, '-', 1) as lang
from people where langs != ''
union
select distinct SUBSTRING_INDEX(SUBSTRING_INDEX(langs, '-', 2), ',', -1)
from people where LENGTH(langs) - LENGTH(REPLACE(langs,',','')) + 1 > 1

演示:http://www.sqlfiddle.com/#!2/b86f2/1


从那里开始,将语言列表与人员列表相结合并计算匹配次数,通过比较 people.langs like '%EN%' 例如:

select
  lang,
  count(case when people.langs like concat('%',langs.lang,'%') then 1 end) as count
from people,
  (
    select distinct substring_index(langs, '-', 1) as lang
    from people where langs != ''
    union
    select distinct SUBSTRING_INDEX(SUBSTRING_INDEX(langs, '-', 2), ',', -1)
    from people where LENGTH(langs) - LENGTH(REPLACE(langs,',','')) + 1 > 1
  ) langs
group by langs.lang
order by langs.lang

示例输出:

LANG    COUNT
====    ====
DE      2
EN      4
RU      2

演示:http://www.sqlfiddle.com/#!2/b86f2/5

关于mysql - 计算整个集合数据库中唯一元素的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10739156/

相关文章:

mysql - 查询获取上个月数据(从现在开始计算)并解析Json以获取Json中的项目

php - PDO INSERT 查询 500 服务器错误

php - 将 QR Code Scanner android 应用程序连接到在线 mySQL 数据库

java.math.BigInteger 不能转换为 java.lang.Integer

mysql - 长查询执行时间锁表

mysql - 如何 SELECT 并前进 7 DAYS MYSQL

php - 两个日期查询之间的mysql日期字符串不起作用

c# - 查询优化或在 ViewModel 中的 DoWork 内缓慢填充 ObservableObject

MYSQL删除重复项并添加其Cnt列

mysql - 通过不使用/查询同一个表两次来优化 mysql 查询