mySQL中的复杂查询(在多个表中搜索用户)

时间:2012-11-02 19:02:47

标签: php mysql wordpress

我有这种结构的表格。

表#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的人来说,这是他们的数据库结构。 我想要做的是根据user_name和全名来获取与我的搜索词匹配的用户的用户ID,由first_name和last_name组成。

换句话说,我希望搜索为这些搜索字词返回1: 'joh','john7','smith','john smi','smith jo'

2 个答案:

答案 0 :(得分: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(*) …获取指示匹配数的单行,并且仅使用SELECT COUNT(*) > 0 …获取0或1


好的,新查询。如果您想要匹配用户的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%'

答案 1 :(得分: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%')

这可以为您提供符合搜索条件的唯一用户ID