MySQL select - 如果匹配同一列中的2个值,则返回值

时间:2017-03-02 19:56:08

标签: mysql sql select

那里有MySQL专家吗?

我有一个auth脚本,它将用户名传递给MySQL查询,如果该用户名为%s2member%则返回用户名,如果不是s2member则返回null

表名是usermeta

****user_id********meta_key********meta_value****
        1           nickname            jsmith
        1           capabilities        a:1:{s:13:"administrator";b:1;}
        2           nickname            paule
        2           capabilities        a13:"s2member";}
        3           nickname            mike
        3           capabilities        a14:"free-member";}
        4           nickname            mrjones
        4           capabilities        a15:"s2member";}
        5           nickname            adam
        5           capabilities        aw7:"s2member";}

由于此数据的布局,我不知道如何查询返回' paule' (如果他有s2成员)。

我的问题:查询甚至可以返回meta_value" paule"如果他喜欢" s2member"在另一个meta_value?

2 个答案:

答案 0 :(得分:1)

您可以使用exists运算符并关联两行

SELECT meta_value
FROM   usertable a
WHERE  meta_key = 'nickname' AND
       meta_value = 'paule' AND -- EDITED IN: Just return paule
       EXISTS (SELECT *
               FROM   usertable b
               WHERE  a.user_id = b.user_id AND
                      b.meta_key = 'capabilities' AND
                      b.meta_value LIKE '%"s2member"%')

答案 1 :(得分:1)

您可以对表使用自联接,并按用户ID匹配行。像这样:

select 
  u1.meta_value 
from 
  usermeta u1
join 
  usermeta u2 
on 
  u1.userid = u2.userid
where 
  u1.meta_value = '<username passed in>'
  and u1.meta_key = 'nickname'
  and u2.meta_key = 'capabilities'
  and u2.meta_value like '%"s2member"%'

一般来说,连接被认为比等效的子查询稍微高一些,但在我看来,子查询通常更具可读性。