Wordpress SQL - категория сообщений и теги
Я использовал этот запрос, чтобы получать сообщения с его категорией и тегами.
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: получить категорию сообщений и теги
Но у меня проблема, запрос игнорирует сообщения без тегов . Я пробовал много других запросов, но не ВСАСЫВАЛ. Кто-нибудь может мне помочь?
Ответы
Вы очень близки к хорошему решению своей проблемы.
Другой респондент упомянул об этом: используйте 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
Все ваши соединения являются внутренними соединениями, поэтому, если данные не совпадают ни в одной из таблиц, эти данные не будут извлечены.
Измените свои внутренние соединения на левые / правые внешние соединения.