[英]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多個用戶,而我更困惑於如何獲取只會說en和sp的用戶數,並且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.