В таблице wp_postmeta
WordPress есть все дополнительные поля для сообщения, но они в строках, поэтому их легко добавить.
Однако теперь я хочу запросить все поля всех сообщений, которые можно сказать, я, очевидно, хочу, чтобы эти поля в столбце, а не в строке.
Это мой запрос, который я запускаю
SELECT p.post_title, m.meta_value, m.meta_key FROM wp_posts p JOIN wp_postmeta m ON p.id = m.post_id WHERE p.id = 72697;
Это даст мне все meta_values и их соответствующие мета-ключи в виде столбцов. Но мне нужны значения мета-ключей как столбцы и мета-значения в виде строк
Например, meta_key
может быть meta_key
, и это может быть значение What's up
Так что мне нужно что-то вроде этого
SELECT p.post_title, additional_description FROM wp_posts p JOIN wp_postmeta m ON p.id = m.post_id WHERE p.id = 72697;
Мне нужна эта колонка. Мне также нужны все сообщения, а не конкретные, но всякий раз, когда я удаляю, where
он просто не запрашивает (у меня много сообщений, это может быть проблемой).
Вот несколько примеров данных и как я хочу, чтобы результаты отображались в таблице wp_postmeta
meta_key post_id meta_key meta_value 1 5 total_related 5 2 5 updated 0 3 5 cricket 1 4 8 total_related 8 5 8 updated 1 6 8 cricket 0 wp_post table id post_title other things I dont care about 5 This is awesome 8 This is more awesome
wp_post id связан с post_id по таблице wp_postmeta
Требуемый результат
post_title total_related updated cricket This is awesome 5 0 1 This is more awesome 8 1 0
Как насчет чего-то подобного?
SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket' FROM wp_posts p LEFT JOIN wp_postmeta m1 ON p.id = m1.post_id AND m1.meta_key = 'total_related' LEFT JOIN wp_postmeta m2 ON p.id = m2.post_id AND m2.meta_key = 'updated' LEFT JOIN wp_postmeta m3 ON p.id = m3.post_id AND m3.meta_key = 'cricket'
И поскольку вы не ищете какую-то конкретную должность, вы сможете это сделать.
Если вы хотите запросить конкретные post_types
вы можете попробовать что-то вроде этого
SELECT p.post_title, m1.meta_value as 'total_related', m2.meta_value as 'updated', m3.meta_value as 'cricket' FROM wp_posts p LEFT JOIN wp_postmeta m1 ON p.id = m1.post_id AND m1.meta_key = 'total_related' LEFT JOIN wp_postmeta m2 ON p.id = m2.post_id AND m2.meta_key = 'updated' LEFT JOIN wp_postmeta m3 ON p.id = m3.post_id AND m3.meta_key = 'cricket' WHERE p.post_type = 'my_custom_post_type';
Попробуй это:
select post_title , MAX(CASE WHEN `meta_key`='total_related' THEN meta_value END)as 'total_related', MAX(CASE WHEN `meta_key` = 'updated' THEN meta_value END) as 'updated' , MAX(CASE WHEN `meta_key` = 'cricket' THEN meta_value END) as 'cricket' FROM wp_posts p JOIN wp_postmeta m ON p.id = m.post_id GROUP BY p.id
Существует несколько подходов.
Ниже приведен пример одного из способов получения указанного результата с использованием коррелированных подзапросов в списке SELECT:
SELECT p.post_title , ( SELECT m1.meta_value FROM wp_post_metadata m1 WHERE m1.meta_key = 'total_related' AND m1.post_id = p.id ORDER BY m1.meta_key LIMIT 1 ) AS `total_related` , ( SELECT m2.meta_value FROM wp_post_metadata m2 WHERE m2.meta_key = 'updated' AND m2.post_id = p.id ORDER BY m2.meta_key LIMIT 1 ) AS `updated` , ( SELECT m3.meta_value FROM wp_post_metadata m3 WHERE m3.meta_key = 'cricket' AND m3.post_id = p.id ORDER BY m3.meta_key LIMIT 1 ) AS `cricket` FROM wp_posts p WHERE p.id IN (5,8)
Существует несколько других подходов, каждый из которых имеет свои преимущества и недостатки.
Есть несколько смежный вопрос, на который я ссылался в комментарии по этому вопросу. Этот вопрос иллюстрирует несколько подходов, но опускает подход с коррелированным подзапросом.)