我有一个正在搜索功能中使用的mysqlqeury,如果startdate等于或低于今天的日期且结束日期等于,则尝试从数据库中检索与关键字匹配的所有数据或者大于今天的日期。
如果我没有检查关键字,但是当我检查关键字时,查询效果很好,那么开始日期和结束日期与我的WHERE语句不匹配。
此部分查询尚未运行:
AND ( ad.date_start <= '2015-12-05' AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00'))
如果我从查询中删除此部分,则所有结果都保持不变。
例如,我使用Startdates获取值:2015-12-23 并且结束如:2015-09-20
我的完整查询是:
SELECT SQL_CALC_FOUND_ROWS p.ID, p.post_title, p.post_date, p.post_status, p.post_type, p.post_content, p.post_excerpt, ad.date_start, ad.date_end FROM wp_posts as p join wp_postmeta as pm on pm.post_id = p.ID JOIN agenda_meta as am ON p.ID = am.post_id JOIN agenda_dates as ad ON p.ID = ad.post_id WHERE p.post_status = 'publish' AND ( p.post_type = 'tentoonstellingsagenda' ) AND ( ad.date_start <= '2015-12-05' AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00')) AND ( p.post_title LIKE '%sprookje%' ) OR p.post_content LIKE '%sprookje%' OR (pm.meta_key='_ap_place_city' and pm.meta_value LIKE '%sprookje%') AND ( am.land = 1 ) GROUP BY p.ID ORDER BY IF (ad.date_start = DATE('2015-12-05') , 1, IF (ad.date_start <= DATE('2015-12-05') , 2, 3 )) DESC, ad.date_start DESC
在PHPMYADMIN中运行我的查询时,我没有得到任何错误,所以不能真正理解这出错的地方...... :(
有什么建议吗?
修改
我还尝试更改不适用的查询部分:
AND ( ad.date_start <= '2015-12-05' ) AND ( ad.date_end >= '2015-12-05' )
这给了我相同的结果..
还尝试仅检查开始日期,但仍然没有得到任何不同的结果:
AND ( ad.date_start <= '2015-12-05' )
答案 0 :(得分:1)
我总是发现在新行上使用每个转义格式化查询有助于查看正在发生的事情。 &#39; open&#39;和'关闭'&#39;括号应在每一行上匹配,每行为1个要求。
您的查询是:
WHERE p.post_status = 'publish'
AND ( p.post_type = 'tentoonstellingsagenda' )
AND ( ad.date_start <= '2015-12-05' AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00'))
AND ( p.post_title LIKE '%sprookje%' )
OR p.post_content LIKE '%sprookje%'
OR (pm.meta_key='_ap_place_city' and pm.meta_value LIKE '%sprookje%')
如果您的记录与OR
匹配,则您的记录不必与OR
之前的任何条款相匹配。我想你需要这个:
WHERE p.post_status = 'publish'
AND ( p.post_type = 'tentoonstellingsagenda' )
AND ( ad.date_start <= '2015-12-05' AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00'))
AND (( p.post_title LIKE '%sprookje%' ) OR p.post_content LIKE '%sprookje%' OR (pm.meta_key='_ap_place_city' and pm.meta_value LIKE '%sprookje%'))
我所做的就是在最后3个要求中添加括号,以便将它们评估为1个要求(不是替代要求)。
答案 1 :(得分:1)
我认为是因为您没有将搜索条件分组到一个组中,因此主要条件中存在OR。
// ..........
WHERE
p.post_status = 'publish'
AND (p.post_type = 'tentoonstellingsagenda')
AND (ad.date_start <= '2015-12-05'
AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00'))
AND (p.post_title LIKE '%sprookje%')
OR p.post_content LIKE '%sprookje%'
OR (pm.meta_key = '_ap_place_city' and pm.meta_value LIKE '%sprookje%')
AND (am.land = 1)
因为xxx中的OR LIKE&#39; %%&#39;在主要的WHERE条件上,所以当有一个OR条件满足时则为真(其他将被忽略)。
尝试将其更改为:
WHERE
p.post_status = 'publish'
AND p.post_type = 'tentoonstellingsagenda'
AND (ad.date_start <= '2015-12-05'
AND ('2015-12-05' <= ad.date_end || ad.date_end = '0000-00-00'))
AND ((p.post_title LIKE '%sprookje%')
OR (p.post_content LIKE '%sprookje%')
OR (pm.meta_key = '_ap_place_city' and pm.meta_value LIKE '%sprookje%'))
AND am.land = 1