mysql - sql 查询问题(嵌套 AND OR)

标签 mysql database wordpress

我正在尝试使用以下查询,但没有获得任何记录:

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE ( wp_term_relationships.term_taxonomy_id IN (92) ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' OR wp_posts.post_status = 'future') 
AND wp_postmeta.meta_key = '_inicio_date' 
AND mt1.meta_key = '_inicio_date' 
AND mt2.meta_key = '_eventtimestamp' 
AND ( (mt1.meta_value BETWEEN 20110201 AND 20110231) OR (mt2.meta_value BETWEEN 20110201 AND 20110231) ) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date asc  

但是,如果我这样做:

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)   
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE ( wp_term_relationships.term_taxonomy_id IN (92) ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' OR wp_posts.post_status = 'future') 
AND wp_postmeta.meta_key = '_inicio_date' 
AND mt1.meta_key = '_inicio_date' 
AND mt2.meta_key = '_eventtimestamp' 
AND (mt1.meta_value BETWEEN 20110201 AND 20110231) 
OR (mt2.meta_value BETWEEN 20110201 AND 20110231) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date asc

它获取记录,但是对于用“OR”找到的记录忽略所有前面的“AND”

如何嵌套最后的“AND”和“OR”?

谢谢

最佳答案

在我看来,wp_posts 中的一个条目可能没有 wp_postmeta 表中的两条连接记录,因此更改

INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 

LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 

还有一件事:使用 BETWEEN 时要小心:

为了在将 BETWEEN 与日期或时间值一起使用时获得最佳结果,请使用 CAST() 将值显式转换为所需的数据类型。示例:如果将 DATETIME 与两个 DATE 值进行比较,请将 DATE 值转换为 DATETIME 值。如果您在与 DATE 的比较中使用字符串常量(例如“2001-1-1”),请将该字符串转换为 DATE。

关于mysql - sql 查询问题(嵌套 AND OR),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384372/

相关文章:

php - WordPress 中的砌体仅显示一列

mysql - 无法使用 Cleardb heroku 保存 utf8

mysql - 从 JavaScript 生成 ERD

mysql - 将 WordPress 从 Linux 迁移到 Windows Server 2012 - 数据库问题

php - 从 WooCommerce 结帐页面获取送货地址?

php - 使用 CodeIgniter 查询数据库以获取过去一周内提交的条目?

Mysql Group by 并按每个组的降序排列

mysql - 允许 CleartextPasswords=1 到 DSN

php - CakePhp : Cake bake doesn't work on Ubuntu.(PDO异常)

mysql唯一索引EXCEPT为空或null