Выберите строки в качестве столбцов для сообщения wordpress meta

В таблице 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) 

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

Есть несколько смежный вопрос, на который я ссылался в комментарии по этому вопросу. Этот вопрос иллюстрирует несколько подходов, но опускает подход с коррелированным подзапросом.)