繁体   English   中英

mysql的简单数据库查询

[英]simple database query for mysql

我在“用户”表中有一个数据库,其中包含4个字段id,name,性别,language
恩。 (数据库条目)

1   jhon     male     en-sp-gr  
2   mira    female    sp-  
3   mike     male     en-  
4   shel    female    sp-gr  

等等...

zh_cn,sp,gr是英语,西班牙语,德语的语言。我试图获取仅讲en,sp(英语和西班牙语)语言的用户数量,数据库包含300多个用户,而我更困惑于如何获取只会说ensp的用户数,并且sp的表的language字段包含字符串

 en-sp-gr 

我如何才能省略-gr和连字符( - )组成字符串,并且仅在一行中执行此操作,因此我必须为每一行执行此操作,然后仅对讲en和sp的那些用户计数。 我不是sql方面的专家:(

您可以执行以下操作:

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 否则,我不知道在解析字符串时您有很多选择。

这就是为什么您不应该在一个字段中存储多个值的原因。 它们应该存储在规范化表中。

但是,您可以通过将-替换为,并使用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
SELECT 
      count(case when language = 'en' then language end) as English, 
      count(case when language = 'sp' then language end) as Spanish 
FROM users

在上面的查询中可以计算英语语言用户和西班牙语语言用户。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM