2010-09-21 166 views
0

在深入研究這個問題之前,首先我將解釋這種情況。我有兩個表,如下所示:MySQL根據另一個表中的數據從一個表中返回結果

USERS TABLE 
user_id 
username 
firstName 
lastName 

GROUPS TABLE 
user_id 
group_id 

我想找回誰的名字的所有用戶是LIKE「%FOO%」,誰是GROUP_ID一組的一部分=「givengid」

因此,查詢想是這樣的:

SELECT user_id FROM users WHERE firstName LIKE '%foo'" 

我可以做一個用戶定義的SQL函數,如ismember(USER_ID,GROUP_ID)如果用戶是該組的一部分,0,如果他們將返回1不在上述select語句中的WHERE子句中。但是,這意味着對於名字與標準匹配的每個用戶而言,必須通過其他數千個其他記錄運行另一個查詢才能找到潛在的匹配條目。

用戶和組表將分別有幾十萬條記錄。使用用戶定義的函數方法還是使用UNION語句運行查詢更傳統?如果UNION方法最好,那麼帶有union聲明的查詢將是什麼樣子?

當然,我會運行基準測試,但我只想對這種情況的解決方案的可能範圍以及通常最有效/最有效的解決方案有所瞭解。

回答

3

您應該使用JOIN來獲得符合您的兩個條件的用戶。

SELECT 
    user_id 
FROM 
    users 
INNER JOIN 
    groups 
    ON groups.user_id = users.users_id 
    AND groups.group_id = given_id 
WHERE 
    firstName LIKE '%foo' 
+0

好奇,INNER JOIN和just JOIN有什麼區別? – user396404 2010-09-21 13:48:16

+0

沒有區別,JOIN是INNER JOIN的語法糖。 – 2010-09-21 15:18:45

1

您不需要在這裏使用UNION或用戶定義的函數;相反,你可以使用一個JOIN(它可以讓你加入一個表基於一組等同列的另一個):

SELECT u.user_id 
FROM users AS u 
JOIN groups AS g 
    ON g.user_id = u.user_id 
WHERE g.group_id = 'givengid' 
    AND u.firstName LIKE '%foo' 

什麼這個查詢請求也就是湊groups錶行於行users表,當user_id是相同的(所以如果你要使用SELECT *,你最終會得到一個包含該用戶的用戶數據和組數據的長行)。如果用戶存在多行groups行,則會在檢索WHERE子句之前檢索多行。

1

使用JOIN:

SELECT DISTINCT user_id 
FROM users 
INNER JOIN groups ON groups.user_id = users.user_id 
WHERE users.firstName LIKE '%foo' 
AND groups.group_id = '23' 

DISTINCT確保你沒有用戶ID重複的結果。

相關問題