我有一个数据库,'用户'表包含4个字段ID,名称,性别,语言
恩。 (数据库条目)
1 jhon male en-sp-gr
2 mira female sp-
3 mike male en-
4 shel female sp-gr
等...
这里 en,sp,gr 是英语,西班牙语,德语的语言我想要获取的数量 只说en,sp(英语和西班牙语)的用户数据库包含超过300个用户,我更加困惑的是如何获得只说 en 和 sp的用户数量表的语言字段包含字符串
en-sp-gr
如何省略 -gr 和连字符( - )形成字符串,这只针对一行,我必须为每一行执行此操作,然后计算这些只会说en和sp的用户 我不是sql的专家:(
答案 0 :(得分:2)
你可以这样做:
SELECT *
FROM users
WHERE language IN ('en-sp', 'sp-en')
但是,您真的应该考虑规范化您的数据库:
Users
ID|Name|Gender
Languages
ID|Code
User_Language_Map
UserID|LanguageID
然后你可以这样做:
SELECT *
FROM Users
WHERE ID IN
(
SELECT UserID
FROM User_Language_Map
WHERE LanguageID IN (IDFORSP, IDFORGR)
GROUP BY UserID
HAVING COUNT(DISTINCT LanguageID) = 2
)
如果你不能这样做,并且语言过滤器将是动态的,那么你真的需要创建一个函数来创建适当的字符串组合(或者你可以动态构建一个正则表达式)并将其传递给你的IN
。否则,我不知道你有很多选项,因为你正在解析字符串。
答案 1 :(得分:2)
这就是您不应该在一个字段中存储多个值的原因。它们应该存储在标准化表中。
但是,您可以将-
替换为,
并使用FIND_IN_SET()
来完成此操作。这是必要的,因为FIND_IN_SET()
需要以逗号分隔的值列表。这只能用少数几种语言进行合理管理,因为您需要将所有排列编码到查询中。出于这个原因(其中包括索引),强烈建议将其重构为一个将用户链接到他们的口语的相关表格。
SELECT COUNT(*) FROM users
WHERE
FIND_IN_SET('en', REPLACE(language,'-',',')) > 0
AND FIND_IN_SET('sp', REPLACE(language,'-',',')) > 0
AND FIND_IN_SET('gr', REPLACE(language,'-',',')) = 0
答案 2 :(得分:1)
SELECT
count(case when language = 'en' then language end) as English,
count(case when language = 'sp' then language end) as Spanish
FROM users
在上面的查询中可以统计英语用户和西班牙语语言 用户。