mysql的简单数据库查询

时间:2012-04-03 18:32:22

标签: php mysql sql database

我有一个数据库,'用户'表包含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的专家:(

3 个答案:

答案 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

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