【发布时间】:2016-03-11 21:50:14
【问题描述】:
我有一个 Wordpress MySQL 数据库,我需要创建一个自定义查询以使用 SQL。我正在尝试返回“date_start”值小于当天且“date_end”值大于或等于当天的当前事件(帖子)。我知道应该返回一条数据记录,但当我尝试同时搜索“date_start”和“date_end”时没有返回任何内容
这是我的旧 SQL 语句:
select ID, post_name, meta_id, meta_key, meta_value from wp_posts inner join wp_postmeta on wp_posts.ID = wp_postmeta.post_id and ((meta_key='date_end' and meta_value >= CURDATE() + interval 1 day) and (meta_key='date_start' and meta_value < CURDATE())) where post_type='programs' order by meta_value
新的 SQL 语句:
SELECT
ID,
post_name,
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start') AS 'date_start',
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end') AS 'date_end'
FROM wp_posts
WHERE
post_type = 'programs'
AND ((CURDATE() >= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start'))
AND (CURDATE() <= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end')))
ORDER BY `wp_posts`.`ID` ASC
返回的日期是:
ID post_name date_start date_end
1221 culture-analytics 20160307 20160610
2446 culture-analytics-tutorials 20160308 20160311
我还尝试过内部连接的 date_start 和 date_end 部分在 WHERE 子句中的位置。
重要提示:wp_postmeta 是多对一模式,而 'date_start' 和 'date_end' 是单独的记录,但都指向同一个 PostID
似乎是什么问题。
【问题讨论】:
-
meta_value >= CURDATE() + interval 1 day不等于“大于等于今天”,是“大于等于明天”。此外,如果值是字符串,您可能需要进行一些类型转换以获得预期/需要的比较结果。 -
@Uueerdo 是的,我知道大于或等于我了解那部分。如果我取出“date_start”部分或“date_end”部分,则返回记录。但如果我同时包含两者,则不会返回任何内容。所以它确实识别并相应地转换日期比较
-
第二个meta_key条件前改为OR
标签: mysql wordpress inner-join where-clause date-comparison