Wordpress продвинутый SQL - объединяет и считает - PullRequest
1 голос
/ 02 июня 2009

Вот как все это работает
Я использую таблицы категорий Wordpress и имею 2 основных категории. Первый называется "location", а второй "subject". Обе категории имеют свои подкатегории.

В моем примере у нас есть "location" категория 17 и "subject" категория 3.

Это то, что я хочу сделать
Я хочу выбрать ТОЛЬКО те данные, где представлены ОБА мои категории 17 И 3.

Этот код работает до сих пор

SELECT term_id, post_title, post_name, ID, object_id, post_status
FROM wp_posts AS wpost
INNER JOIN wp_term_relationships
   ON wpost.ID = wp_term_relationships.object_id

INNER JOIN wp_term_taxonomy
   ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category'

WHERE wp_term_taxonomy.term_id IN (17, 3)
   AND post_status = 'publish'

Проблема
Обе категории 17 и 3 существуют в одном столбце. Код выше перечисляет идентификаторы дважды, если сообщения появляются в обеих категориях.

Есть ли способ подсчитать идентификаторы, которые равны в результате? Если идентификатор существует дважды, выберите сообщение с этим идентификатором .

Ответы [ 3 ]

1 голос
/ 02 июня 2009

Это выберет каждое сообщение только один раз, если оно существует в обеих категориях:

SELECT  post_title, post_name, post_status
FROM    wp_posts AS wpost
WHERE   post_status = 'publish'
        AND EXISTS (
        SELECT   1
        FROM     wp_term_relationships
        INNER JOIN
                 wp_term_taxonomy
        ON       wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
                 AND wp_term_taxonomy.taxonomy = 'category'
                 AND wp_term_taxonomy.term_id IN (17, 3)
        WHERE    wp_term_relationships.object_id = wpost.ID
        LIMIT 1, 1
        )
0 голосов
/ 03 июня 2009

На шаг ближе? Теперь единственное, что мне нужно сделать - это показать строки, содержащие «2» в столбце «count».

Поскольку столбец count был создан в цикле, он не смог просто написать «AND count = 2».

В этом примере отображается результат, включая столбец count:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(ID) as count
FROM wp_posts AS wpost
INNER JOIN wp_term_relationships
   ON wpost.ID = wp_term_relationships.object_id

INNER JOIN wp_term_taxonomy
   ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category'

WHERE wp_term_taxonomy.term_id IN (17, 3)
   AND post_status = 'publish'

GROUP BY ID
0 голосов
/ 03 июня 2009

Это будет сделано (при условии, что для записи в категории 3 или 17 нет повторяющихся строк) без необходимости во вложенном запросе:

SELECT term_id, post_title, post_name, ID, object_id, post_status, COUNT(*) as count
FROM wp_posts AS wpost
INNER JOIN wp_term_relationships
   ON wpost.ID = wp_term_relationships.object_id

INNER JOIN wp_term_taxonomy
   ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id AND wp_term_taxonomy.taxonomy = 'category'

WHERE wp_term_taxonomy.term_id IN (17, 3)
   AND post_status = 'publish'
   AND count = 2

GROUP BY ID

Добавление переменной count и предложение GROUP BY объединит дубликаты. Затем вы фильтруете строки, где количество равно 2, чтобы получить записи в обеих категориях.

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