2012-11-02 125 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%') 

这应该让你符合搜索条件