2017-03-02 63 views
1

任何MySQL專家?MySQL選擇 - 如果在同一列中匹配2個值,則返回值

我有通行證用戶名到MySQL查詢,並應返回用戶名稱,用戶名具有%s2member%或返回null如果沒有s2member

表名是usermeta一個auth腳本

****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'(如果他有s2member)。

我的問題:如果查詢有可能返回meta_value「paule」,如果他在另一個meta_value中有LIKE「s2member」?

回答

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"%') 
+0

謝謝 - 雖然在webmin中測試時我不得不從LIKE中刪除雙引號,但不確定webmin問題與其他答覆是否也有雙引號,所以非常感謝您的幫助。 – Paul

+0

我剛剛意識到,我認爲這會返回每個相關用戶?我只需要在查詢中指定的一個用戶。感謝雖然:) – Paul

+0

@保羅你可以添加另一個條件 - 我已經編輯它在我的答案,檢查出來。 – Mureinik

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"%' 

一般來說,連接被認爲是稍微比同等的子查詢更好的性能,但在我看來,子查詢往往更具可讀性。

+0

謝謝你的回答,我同意子查詢對於MySQL學習者來說更具可讀性。非常感謝 – Paul

+0

這是正確的答案,但由於我的名聲低,我不確定是否可以標記它。非常感謝您的幫助。這從我到現在已經花了很多很多時間!時間喝點啤酒,爲你歡呼! :) – Paul

相關問題