Wordpress SQL - категория сообщений и теги

Sep 02 2020

Я использовал этот запрос, чтобы получать сообщения с его категорией и тегами.

SELECT
    p.id,
    p.post_name,
    c.name,
    GROUP_CONCAT(t.`name`)
FROM wp_posts p
JOIN wp_term_relationships cr
    on (p.`id`=cr.`object_id`)
JOIN wp_term_taxonomy ct
    on (ct.`term_taxonomy_id`=cr.`term_taxonomy_id`
    and ct.`taxonomy`='category')
JOIN wp_terms c on
    (ct.`term_id`=c.`term_id`)
JOIN wp_term_relationships tr
    on (p.`id`=tr.`object_id`)
JOIN wp_term_taxonomy tt
    on (tt.`term_taxonomy_id`=tr.`term_taxonomy_id`
    and tt.`taxonomy`='post_tag')
JOIN wp_terms t
    on (tt.`term_id`=t.`term_id`)
GROUP BY p.id

Это из Wordpress SQL: получить категорию сообщений и теги

Но у меня проблема, запрос игнорирует сообщения без тегов . Я пробовал много других запросов, но не ВСАСЫВАЛ. Кто-нибудь может мне помочь?

Ответы

1 O.Jones Sep 02 2020 at 02:16

Вы очень близки к хорошему решению своей проблемы.

Другой респондент упомянул об этом: используйте LEFT JOIN. Почему? Обычный внутренний JOINподавляет строки из первой таблицы, которые не соответствуют строкам из второй таблицы.

Ваш код также показывает признаки неправильного использования пресловутого расширения MySQL для GROUP BY . Если вы скажете

   SELECT id, name, value
     FROM tbl
    GROUP BY id, name

ты действительно говоришь

  SELECT id, name, ANY_VALUE(value)
    FROM tbl
   GROUP BY id, name

Другими словами, сервер выбирает valueиз группы все, что хочет. Вы должны использовать предсказуемый совокупный результат, например MAX(value)или GROUP_CONCAT(value). Версия 8 MySQL и другие производители и модели сервера таблиц SQL отвергают используемый вами синтаксис.

Совет для вашего здравомыслия, не используйте обратные кавычки вокруг имен таблиц или столбцов, если они не являются зарезервированными словами в SQL. И, профессиональный совет , не используйте зарезервированные слова для имен таблиц или столбцов.

Вместо этого используйте этот запрос.

SELECT
    p.id,
    p.post_name,
    GROUP_CONCAT(c.name ORDER BY c.name) categories,
    GROUP_CONCAT(t.name ORDER BY t.name) tags
FROM wp_posts p
LEFT JOIN wp_term_relationships cr
    on (p.id=cr.object_id)
LEFT JOIN wp_term_taxonomy ct
    on (ct.term_taxonomy_id=cr.term_taxonomy_id
    and ct.taxonomy='category')
LEFT JOIN wp_terms c on
    (ct.term_id=c.term_id)
LEFT JOIN wp_term_relationships tr
    on (p.id=tr.object_id)
LEFT JOIN wp_term_taxonomy tt
    on (tt.term_taxonomy_id=tr.term_taxonomy_id
    and tt.taxonomy='post_tag')
LEFT JOIN wp_terms t
    on (tt.term_id=t.term_id)
GROUP BY p.id, p.post_name
2 Atif Sep 02 2020 at 01:49

Все ваши соединения являются внутренними соединениями, поэтому, если данные не совпадают ни в одной из таблиц, эти данные не будут извлечены.

Измените свои внутренние соединения на левые / правые внешние соединения.