2011-05-01 58 views
2

當我只是讓一個WHERE並刪除其他它會返回我正確的結果。當我擁有它時,它不會顯示任何東西。我怎樣才能正確地寫下我的邏輯?我遇到了一些困難,在我的錯誤倍數查詢

我的目標是隻顯示滿足「extra1 = $ value1和extra2 = $ value2和extra3 = $ value3」的結果。

我在某處讀到我必須添加addslashes。它有什麼用處?

$value1 = addslashes($_GET['extra1']); 
$value2 = addslashes($_GET['extra2']); 
$value3 = addslashes($_GET['extra3']); 

$theposts = $wpdb->get_results("SELECT post_title FROM {$wpdb->posts} 
WHERE ID IN 
(
    SELECT DISTINCT post_id 
    FROM {$wpdb->postmeta} 
    WHERE meta_key = 'extra1' AND meta_value = '$value1' 
    WHERE meta_key = 'extra2' AND meta_value = '$value2' 
    WHERE meta_key = 'extra3' AND meta_value = '$value3' 

)"); 

回答

1

它們合併如果你的數據庫支持的交點,那麼你可以這樣做:

SELECT post_id 
FROM {$wpdb->postmeta} 
WHERE meta_key = 'extra1' AND meta_value = '$value1' 
    INTERSECT 
SELECT post_id 
FROM {$wpdb->postmeta} 
WHERE meta_key = 'extra2' AND meta_value = '$value2' 
    INTERSECT 
SELECT post_id 
FROM {$wpdb->postmeta} 
WHERE meta_key = 'extra3' AND meta_value = '$value3' 

這會給你所有的post_id S作extra1 /值1,extra2/value2和extra3/value3。

如果你沒有INTERSECT(例如,據我所知,MySQL的),你可以嘗試HAVING

SELECT post_id 
FROM {$wpdb->postmeta} 
WHERE meta_key = 'extra1' AND meta_value = '$value1' 
    OR meta_key = 'extra2' AND meta_value = '$value2' 
    OR meta_key = 'extra3' AND meta_value = '$value3' 
GROUP BY post_id 
HAVING COUNT(*) = 3 
+0

爲了清除我的想法...即使帖子沒有metakey作爲extra2和metavalue作爲value2,它也會顯示metakey爲extra1和metavalue作爲value1的帖子?因爲我只想要滿足所有WHERE的帖子。該帖子必須顯示extra1/value1,extra2/value2和extra3/value3。 – EnexoOnoma 2011-05-01 06:45:13

+0

@Mairy:這兩個選項(我在你的評論後添加了一個更新)將產生'post_id's同時滿足所有三個條件。 「INTERSECT」只是集合論的通常交集。 HAVING方法對大腦有點困難,但它或多或少是一種使用聚集(在這種情況下爲「COUNT」)的方式來選擇結果,因爲在WHERE中不能這樣做;此方法假定您的表中沒有任何重複(post_id,meta_key,meta_value)三元組。 – 2011-05-01 06:50:29

+0

@Mairy:順便說一句,當你使用'IN'時,不需要'DISTINCT'。 'IN'是一個設置操作,所以它不會在意重複。 'DISTINCT'的確具有不重要的執行成本,因爲它通常涉及對結果進行排序並對排序結果進行表掃描。 – 2011-05-01 06:53:09

1

每個(子)查詢只能有一個WHERE。用後者替換隨後的WHERE。順便說一句:錯誤信息說什麼?

+1

我怎樣才能做到這一點?我的目標是隻顯示滿足「extra1 = value1和extra2 = value2和extra3 = value3」的結果。 – EnexoOnoma 2011-05-01 06:29:05

0

與關鍵字OR

WHERE meta_key = 'extra1' AND meta_value = '$value1' 
OR 
meta_key = 'extra2' AND meta_value = '$value2' 
OR 
meta_key = 'extra3' AND meta_value = '$value3' 
+0

它顯示我所有的結果,而不是正確的 – EnexoOnoma 2011-05-01 06:37:34

+0

您可以請張貼您的表的結構,並確切地說你期望從它。也許一些樣本值會有幫助。 – 2011-05-01 06:40:09

0

你也可以使用此:

SELECT p.post_title FROM {$wpdb->posts} AS p 
WHERE EXISTS 
    (SELECT * 
    FROM {$wpdb->postmeta} AS pm 
    WHERE pm.meta_key = 'extra1' AND pm.meta_value = '$value1' 
     AND pm.post_id = p.ID 
) 
    AND EXISTS 
    (SELECT * 
    FROM {$wpdb->postmeta} AS pm 
    WHERE pm.meta_key = 'extra2' AND pm.meta_value = '$value2' 
     AND pm.post_id = p.ID 
) 
    AND EXISTS 
    (SELECT * 
    FROM {$wpdb->postmeta} AS pm 
    WHERE pm.meta_key = 'extra3' AND pm.meta_value = '$value3' 
     AND pm.post_id = p.ID 
) 
相關問題