MySql 查询未返回正确数据

MySql query not returning correct data

我有一个 Wordpress MySQL 数据库,我需要创建自定义查询以使用 SQL。我正在尝试 return 当前事件 (post),其中 "date_start" 值小于当前日期且 "date_end" 值大于或等于当前日期.我知道有一个数据记录应该被 returned 但是当我尝试对 "date_start" 和 "date_end"[=14= 进行搜索时没有任何东西被 returned ]

这是我以前的 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

return编辑的日期是:

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_key 上有两个相互冲突的约束。您的查询要求 meta_key 同时等于 "date_start" 和 "date_end"。

也许可以试试这样:

SELECT
    ID,
    post_name,
    meta_id,
    (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 (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start') < CURDATE()
    AND (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end') >= (CURDATE() + INTERVAL 1 DAY)
ORDER BY 4

我无法访问 Wordpress 数据库,所以我没有 运行 但它可能有用...

@obe 在他的回答中抓住了您原始查询的核心问题;但我会用一个额外的连接而不是四个子查询来解决它:

SELECT ID, post_name, meta_id
   , beginMeta.meta_key As beginKey, endMeta.meta_key AS endKey
   , beginMeta.meta_value AS beginDate
   , endMeta.meta_value AS endDate
FROM wp_posts 
INNER JOIN wp_postmeta AS endMeta 
   ON wp_posts.ID = endMeta.post_id 
   AND endMeta.meta_key='date_end' 
   AND endMeta.meta_value >= CURDATE() + interval 1 day 
INNER JOIN wp_postmeta AS beginMeta 
   ON wp_posts.ID = beginMeta .post_id 
   AND beginMeta.meta_key='date_start' 
   AND beginMeta.meta_value < CURDATE() 
WHERE post_type='programs' 
ORDER BY beginDate, endDate
;

编辑:假设 (post_id、meta_key) 组合在 wp_postmeta 中是唯一的。