проблема с SQL-запросом (вложенный И ИЛИ) - PullRequest
1 голос
/ 22 марта 2011

Я пытаюсь использовать следующий запрос, но он не получает никаких записей:

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE ( wp_term_relationships.term_taxonomy_id IN (92) ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' OR wp_posts.post_status = 'future') 
AND wp_postmeta.meta_key = '_inicio_date' 
AND mt1.meta_key = '_inicio_date' 
AND mt2.meta_key = '_eventtimestamp' 
AND ( (mt1.meta_value BETWEEN 20110201 AND 20110231) OR (mt2.meta_value BETWEEN 20110201 AND 20110231) ) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date asc  

Но, если я сделаю:

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)   
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE ( wp_term_relationships.term_taxonomy_id IN (92) ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' OR wp_posts.post_status = 'future') 
AND wp_postmeta.meta_key = '_inicio_date' 
AND mt1.meta_key = '_inicio_date' 
AND mt2.meta_key = '_eventtimestamp' 
AND (mt1.meta_value BETWEEN 20110201 AND 20110231) 
OR (mt2.meta_value BETWEEN 20110201 AND 20110231) 
GROUP BY wp_posts.ID 
ORDER BY wp_posts.post_date asc

Получает записи, но игнорирует все предыдущие «И» для записей, найденных с «ИЛИ»

Как мне вставить последние "И" и "ИЛИ"?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 марта 2011

Работало, используя это:

SELECT wp_posts.* FROM wp_posts 
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) 
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 
WHERE ( wp_term_relationships.term_taxonomy_id IN (".$categoria.") ) 
AND wp_posts.post_type = 'post' 
AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'private' OR     wp_posts.post_status = 'future') 
AND ( ( mt1.meta_key = '_incio_date' AND (mt1.meta_value BETWEEN 20110201 AND 20110231) ) OR (mt2.meta_key = '_eventtimestamp' AND (mt2.meta_value BETWEEN 20110201 AND 20110231) ) )
GROUP BY wp_posts.ID ORDER BY wp_posts.post_date asc
0 голосов
/ 22 марта 2011

Мне кажется, что одна запись в wp_posts может не иметь обеих связанных записей в таблице wp_postmeta, поэтому измените

INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
INNER JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 

на

LEFT JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id) 
LEFT JOIN wp_postmeta AS mt2 ON (wp_posts.ID = mt2.post_id) 

Еще одна вещь: будьте осторожны, когдавы используете BETWEEN:

Для получения наилучших результатов при использовании BETWEEN со значениями даты или времени используйте CAST () для явного преобразования значений в требуемый тип данных.Примеры: Если вы сравниваете DATETIME с двумя значениями DATE, преобразуйте значения DATE в значения DATETIME.Если вы используете строковую константу, такую ​​как '2001-1-1', в сравнении с DATE, приведите строку к DATE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...