簡體   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