2012-11-02 73 views
1

我有這種結構的表。mySQL中的複雜查詢(在多個表中搜索用戶)

表#1:用戶(ID,USER_NAME)

1, 'john777' 
2, 'andy' 
3, 'tom' 

表#2:user_meta(meta_ID,USER_ID, 'meta_name', 'meta_value')

1, 1, 'first_name', 'John' 
2, 1, 'last_name', 'Smith' 
3, 2, 'first_name', 'Andy' 
4, 2, 'last_name', 'Pete' 
5, 3, 'first_name', 'Thomas' 
6, 3, 'last_name', 'Tan' 
7, 3, 'other_random_meta', 'abcxyz' 

爲你們熟悉與WordPress,這是他們的數據庫結構。 我想要做的是根據由first_name和last_name組成的user_name和全名來獲取與我的搜索詞匹配的用戶的用戶標識。

換句話說,我想搜索到這些搜索字詞返回1: 'JOH', 'john7', '史密斯', '約翰SMI', '史密斯JO'

+0

了獨特的用戶ID和問題是? ?? – thatidiotguy

+0

問題是我如何編寫查詢來達到上述結果。 – mushroom

回答

1

SELECT * FROM 
(
    SELECT user_name AS user FROM users 
    UNION ALL 
    SELECT meta_value AS user FROM user_meta 
    WHERE meta_name = 'first_name' OR meta_name = 'last_name' 
) 
WHERE user LIKE '%your search%' 

將返回符合條件的所有用戶。重複不會被消除並按原樣返回。

爲了得到一個單行顯示匹配的數目使用SELECT COUNT(*) …,並只得到0或1使用SELECT COUNT(*) > 0 …


好了,新的查詢。如果你想匹配用戶的ID,您必須將兩個表連接在一起:

SELECT DISTINCT u.user_id 
FROM users u 
JOIN user_meta m 
ON u.user_id = m.user_id 
WHERE u.user_name LIKE '%name%' OR m.first_name LIKE '%name%' OR m.last_name LIKE '%name%' 
+0

對不起,還有一件事要澄清,user_meta表可能包含其他隨機元素,如用戶的電子郵件。我只想從first_name和last_name進行連接搜索。 – mushroom

+1

@jon:好的。但是,這與添加WHERE子句一樣簡單,沒有什麼複雜的... – knittl

+0

感謝您的迴應,但我不認爲您完全明白我在找什麼。對我的不好解釋抱歉。我其實想要獲得與搜索查詢匹配的用戶的ID。你的查詢只給出了每個部分的匹配。 – mushroom

1
SELECT DISTINCT ID FROM 
(SELECT ID AS ID FROM users WHERE user_name LIKE 'YOURSEARCH%' 
UNION 
SELECT t1.user_id FROM 
    (SELECT user_id, meta_value AS firstName FROM user_meta WHERE meta_name ='first_name') AS t1 
INNER JOIN 
    (SELECT user_id, meta_value AS lastName FROM user_meta WHERE meta_name ='last_name') AS t2 ON t1.user_id=t2.userID 
WHERE concat_ws(' ',lastName,firstName) LIKE'YOURSEARCH%') 

這應該讓你符合搜索條件