Mysql查询返回0个结果。

3

在这两行中给定的值,为什么我的查询返回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)OR(meta_key = 'wpcf-milk' AND meta_value BETWEEN 20 AND 200),您必须使用OR。 - Beto
你所说的“正常工作”是什么意思?你希望它以何种方式工作? - pathfinderelite
哦,实体属性值模型的乐趣。有趣,有趣,有趣 - spencer7593
1
@spencer7593 这就是WordPress的特点! - Strawberry
2个回答

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 ))

将AND改为OR。


1
如果不是出于布尔偏执狂的原因,为了清晰起见,可能应该将 () OR () 包裹在 () 中。 ;) - Uueerdo
@Uueerdo:以前我从来没有为我的困扰起个名字... 布尔疑病。我们知道运算符有优先级,但是通过使用括号,我们可以使优先级明确,并且我们永远不必记住/查找AND或OR的优先级高。也许我患有布尔优先级记忆障碍。(我怀疑这意味着与“懒惰”相同。) - spencer7593
我怀疑这不是真正想要的。我怀疑 OP 想要两个值都为 true(因为它们确实如此),而不仅仅是其中一个。 - Strawberry
正确,两个值都需要为真。 - Jeff Purcell

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;

另一种方法涉及外连接,速度略快,但输入起来稍微有些繁琐 - 所以我会让其他人来完成。

这个很好用。谢谢你。我能在联接语句中使用这些别名吗?一个ID存储在meta_value字段中,但查询一直产生错误,指出该列不存在。我应该发另一个问题吗? - Jeff Purcell
答案可能不是完全直接的,所以我认为你应该提出一个新问题,但是参考这个问题。 - Strawberry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接