2011-11-25 30 views
0

我是MySQL的新手,我遇到了使用PHP查詢的問題。看最後三行。與多個AND的MySQL查詢

$query = " 
SELECT post_content, slug, ID 
FROM wp_posts 

INNER JOIN wp_term_relationships 
ON wp_posts.ID = wp_term_relationships.object_id 

INNER JOIN wp_terms 
ON wp_term_relationships.term_taxonomy_id = wp_terms.term_id 

INNER JOIN wp_postmeta 
ON wp_posts.ID = wp_postmeta.post_id 

WHERE post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera' 
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72' 
OR post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72' 
"; 

隨着最後三個行我想說:

行1)選擇查詢,如果它: 是發佈,擁有-蛞蝓和犯規都meta_key「包含」或「排除」

行2)選擇查詢,如果它: 是發佈,有着段塞,有meta_key「包括」 meta_value是「72」

行3)選擇查詢,如果它: 是發佈,擁有-蛞蝓,有meta_key「排除」和meta_val ue不是'72'

但它讓我回到每個選擇的雙倍或tripple。 只有當它匹配這三個senarios中的一個時才應該被選中。我究竟做錯了什麼?

回答

4

您需要使用括號:

WHERE (post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera') 
OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72') 
OR (post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72') 

只是混合ORAND語句就像你在你的例子做評估,以true所有情況下post_status = 'publish'

順便說一句,我假設Row 1)等指線在你的代碼,而不是你希望從數據庫返回的行...

+0

我已經試過了,但是沒有什麼區別。是的,「行1行2和行3」我的意思是我的例子中的最後三行。請再看一遍。 – Hakan

+0

也許你的'join'有一個額外的問題;你有重複的行嗎? – jeroen

+0

是的,我有兩到三個重複的行。將嘗試沒有連接。 – Hakan

1

這應有助於把圍繞單獨設置的括號標準。

例如

$query = " 
... 
WHERE 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key <> 'include' AND meta_key <> 'exkludera') 
OR 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'include' AND meta_value = '72') 
OR 
(post_status = 'publish' AND slug = 'a-slug' AND meta_key = 'exclude' AND meta_value <> '72') 
"; 

事實上,由於一些標準是共同的,你可以把它改寫這樣的:

$query = " 
... 
WHERE 
post_status = 'publish' AND slug = 'a-slug' AND 
(
(meta_key <> 'include' AND meta_key <> 'exkludera') 
OR 
(meta_key = 'include' AND meta_value = '72') 
OR 
(meta_key = 'exclude' AND meta_value <> '72') 
) 
"; 

您還可以使用DISTINCT,以確保只有一個每個記錄的副本返回,如果有必要。

SELECT DISTINCT post_content, slug, ID 
+0

沒有解決我的問題,但非常好知道!謝謝!我找到了這個問題,最後三行對這些連接起作用。所以它一定是關於他們的... – Hakan

0

我有這個相同的問題。

我相信問題在於,在將它們與您正在使用的ANDs組合時,您並未包裝您的OR。當一起使用OR和AND時,它們必須被包裹在「()」中,否則你將會發生衝突。

這裏有一個鏈接顯示例子,這是如何工作以及文字描述: http://www.w3schools.com/sql/sql_and_or.asp