2015-05-06 291 views
3

給定這兩行中的值,爲什麼我的查詢返回0行以及如何重寫查詢以正常工作?Mysql查詢返回0結果

meta_id post_id meta_key meta_value 
    1422  73 wpcf-milk  22 
    1423  73 wpcf-mw  -7 

SQL查詢:

SELECT * FROM wp_postmeta 
    WHERE post_id = 73 
    AND (meta_key = 'wpcf-mw' AND meta_value BETWEEN -8 AND 200) 
    AND (meta_key = 'wpcf-milk' AND meta_value BETWEEN 20 AND 200) 
+1

(meta_key ='wpcf-mw'AND meta_value BETWEEN -8 AND 200)或(meta_key ='wpcf-milk'AND meta_value BETWEEN 20 AND 200)您必須使用OR – Beto

+0

您的意思是「正常工作」?你希望它的工作方式是什麼? – pathfinderelite

+0

哦,Entity-Attribute-Value模型的* joys *。有趣,有趣,*有趣*。 – spencer7593

回答

0

實質上有兩種方法。一個是大致如下:

SELECT post_id 
    , MAX(CASE WHEN meta_key = 'wpcf-milk' THEN meta_value END) wpcf_milk 
    , MAX(CASE WHEN meta_key = 'wpcf-mw' THEN meta_value END) wpcf_mw 
    FROM wp_postmeta 
GROUP 
    BY post_id 
HAVING wpcf_milk BETWEEN 20 AND 200 
    AND wpcf_mw BETWEEN -8 AND 200; 

另一種方法涉及外部連接和速度稍快,但稍微繁瑣的打字出來 - 所以我要把它留給別人。

+0

這工作得很好。這次真是萬分感謝。我能在聯合聲明中使用這些別名嗎?有一個ID存儲在meta_value字段中,但查詢不停地產生一個錯誤,指出該列不存在。我應該發表另一個問題嗎? –

+0

答案可能並非完全直截了當,所以我認爲你應該提出一個新問題,但請回顧一下。 – Strawberry

2
SELECT * FROM wp_postmeta 
WHERE post_id = 73 
    AND ((meta_key = 'wpcf-mw' AND meta_value BETWEEN -8 AND 200) 
    **OR** (meta_key = 'wpcf-milk' AND meta_value BETWEEN 20 AND 200)) 

變化與由OR。

+1

爲了清楚起見,可能應該將'()OR()'包裝在'()'中,如果不是布爾偏執狂。 ;) – Uueerdo

+0

@Uueerdo:我以前從來沒有爲我的痛苦命名...... **布爾偏執**。我們知道*運算符有優先權,但對於parens,我們可以使優先級明確,並且我們永遠不必記住/查找AND或OR是否具有更高的優先級。也許我受**布爾優先記憶障礙**。 (我懷疑這意味着與「懶惰」相同的東西。) – spencer7593

+0

我懷疑這不是真正想要的。我懷疑OP希望兩個值都是真實的(因爲它們是),而不僅僅是其中之一。 – Strawberry