SQL-запрос INNER JOIN или LEFT JOIN Хотите выбрать сообщения из определенных категорий в Wordpress, но НЕ выбирайте сообщения из другой определенной категории - PullRequest
0 голосов
/ 25 февраля 2019

Выбор определенных категорий работает нормально:

SELECT ID, post_content, post_title
FROM wp_posts
  LEFT JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.id
  AND wp_term_relationships.term_taxonomy_id IN (17,19)

Теперь добавляем исключение, чтобы НЕ выбирать сообщения, которые, например, относятся к категории 17 И в категории 20, они должны быть исключены из запроса выбора.

Я пробовал это:

SELECT ID, post_content, post_title
FROM wp_posts
  LEFT JOIN wp_term_relationships ON wp_term_relationships.object_id = wp_posts.id AND wp_term_relationships.term_taxonomy_id IN (17,19)
WHERE wp_term_relationships.term_taxonomy_id NOT IN (20)

Но это не показывает никакого эффекта.Кто-нибудь понял, что я делаю не так?

Заранее спасибо.

1 Ответ

0 голосов
/ 25 февраля 2019

Я думаю, что вы хотите:

SELECT wp.ID, wp.post_content, wp.post_title
FROM wp_posts wp
WHERE NOT EXISTS (SELECT 1
                  FROM  wp_term_relationships tr 
                  WHERE tr.object_id = wp.id AND
                        tr.term_taxonomy_id IN (17, 19)
                 );

Это удаляет любые отношения, которые имеют 17 или 19.

Другой подход заключается в использовании агрегации:

SELECT wp.ID, wp.post_content, wp.post_title
FROM wp_posts wp JOIN
     wp_term_relationships tr 
     ON tr.object_id = wp.id
GROUP BY wp.ID, wp.post_content, wp.post_title
HAVING SUM( CASE WHEN tr.term_taxonomy_id IN (17, 19) THEN 1 ELSE 0 END) = 0;
...