2015-05-06 239 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