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

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
dede 1 Сен 2020 в 21:45

2 ответа

Лучший ответ

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

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

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

   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
1
O. Jones 1 Сен 2020 в 19:16

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

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

2
Atif 1 Сен 2020 в 18:49