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 中是唯一的。
我有一个 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 中是唯一的。