簡體   English   中英

加入查詢多行進行搜索

[英]Join Query on multiple rows to search in

目前我正在使用Wordpress網站,我希望能夠在我網站的一部分上搜索用戶名和姓。

Wordpress利用元表為用戶存儲任何“額外”數據。 名字和姓氏是其中一些元字段。

現在我正在嘗試創建一個查詢,它給我一個結果,它返回一個匹配名字和姓氏的用戶,唯一的問題是有一個名字的元行和另一個名字,他們都有對同一user_id的引用。 只有我不知道如何正確創建查詢。

當我有這個查詢

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName')

它確實返回了我正在尋找的用戶,但是當我嘗試這個時

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id
AND (US.meta_key='first_name' AND US.meta_value='MyFirstName')
AND (US.meta_key='last_name' AND US.meta_value='Dijkstra')

我根本沒有結果,有人可以幫助我嗎?

如果有人對數據庫結構感興趣,這里( http://cl.ly/6rGx )是users表,這里( http://cl.ly/6rts )是users_meta表。

提前致謝

您不能同時將一行連接到另一個表的另一行,因此您需要將另一個表連接兩次,一次用於名字,一次用於姓氏。 像這樣:

SELECT U.id 
FROM wp_users AS U
inner join wp_usermeta as UMF on U.id = UMF.user_id 
inner join wp_usermeta as UML on U.id = UML.user_id 
WHERE UMF.meta_key = 'first_name' 
    AND UMF.meta_value = 'MyFirstName'
    AND UML.meta_key = 'last_name' 
    AND UML.meta_value = 'Dijkstra'

通過重寫AND的順序來考慮邏輯(不,parens沒有區別)。

US.meta_key='first_name' AND US.meta_key='last_name' AND
US.meta_value='MyFirstName' AND US.meta_value='Dijkstra'

看到問題? 這種情況永遠不會成立,因為US.meta_keyUS.meta_value都不會是兩個值。 您需要使用OR ,而不是AND

編輯

像這樣的查詢會給你想要的結果:

SELECT U.id FROM wp_users AS U, wp_usermeta as US
WHERE U.id=US.user_id AND (
    (US.meta_key='first_name' AND US.meta_value='MyFirstName')
    OR (US.meta_key='last_name' AND US.meta_value='Dijkstra'))

您需要加入兩次,每種情況都有不同的條件。 條件可以在RedFilter建議的WHERE子句中,但我更喜歡JOIN子句中的復合條件以提高可讀性。

SELECT U.id 
FROM wp_users U
join wp_usermeta f on U.id = f.id 
                   and f.meta_key='first_name' 
                   and f.meta_value='MyFirstName'
join wp_usermeta l on U.id = l.id 
                   and l.meta_key='last_name' 
                   and l.meta_value='Dijkstra'

與連接中的鍵和where子句中的請求值略有不同的版本:

SELECT U.id 
FROM wp_users U
join wp_usermeta f on U.id = f.id and f.meta_key='first_name' 
join wp_usermeta l on U.id = l.id and l.meta_key='last_name' 
where f.meta_value='MyFirstName' and l.meta_value='Dijkstra'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM