2015-11-19 2 views
0

У меня есть mysqlqeury, который используется в функции поиска, я пытаюсь получить все данные из базы данных, которая соответствует ключевым словам, если начальная дата равна или ниже Текущая дата и дата окончания равны или превышают сегодняшнюю дату.MYSQL Часть моего WHERE Запрос не был запущен

Запрос отлично работает, если я не проверяю ключевые слова, но когда я проверяю ключевые слова, дата начала и дата окончания не соответствуют моему заявлению 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 И EndDates как: 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 я получаю whatsover никакой ошибки, так что на самом деле не понимая, где это происходит не так ... :(

Любые предложения?

EDIT

Я также попытался изменить часть запроса, который не работает на:

AND (ad.date_start <= '2015-12-05') AND (ad.date_end >= '2015-12-05') 

Это дало мне те же результаты ..

также пытался только для проверки даты начала и до сих пор не получают никаких diffrent результатов:

AND (ad.date_start <= '2015-12-05') 
+0

Ваша ошибка в 'п OR' (ов), а также ваше отсутствие скобок ограждают каждое требование. – MaggsWeb

ответ

1

Я всегда нахожу, что при форматировании запроса с каждой contition на новую линии позволяет увидеть, что гой ng on. Количество «открытых» и «закрытых» скобок должно совпадать в каждой строке, а каждая строка - 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 требование (не является альтернативой требованию).

+0

Ты мой друг мой герой дня: P Спасибо за помощь, это действительно проблема, настолько тупой, что я не думал об этом: P – Lennart

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%') 
AND (am.land = 1) 

потому ИЛИ в хом LIKE «%%» на основном WHERE условия так, когда есть один или условие удовлетворения, то оно истинно (другие будут проигнорированы).

попробуйте изменить его на:

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 
Смежные вопросы