Вопрос или проблема
Я хочу выбрать ‘name’, ‘SKU’ и ‘price’ из 2 таблиц WP: wp_posts и wp_postmeta. Я не знаю, как получить данные из столбца ‘meta_value’ дважды для ‘meta_key’=’_price’ и ‘meta_key’=’_sku’, например.
Мой текущий запрос:
"SELECT a.post_title, m1.meta_value, m2.meta_value FROM wp_posts a, wp_postmeta m1, wp_postmeta m2
WHERE a.post_type="product" AND m1.post_id = a.ID
AND m1.meta_key='_sku'
AND m2.meta_key='_price'"
Не проверено на 100%, но это может сработать:
SELECT a.post_title, m1.meta_value AS SKU, m2.meta_value AS PRICE
FROM wp_posts a
LEFT JOIN wp_postmeta m1
ON a.ID = m1.post_id
LEFT JOIN wp_postmeta m2
ON a.ID = m2.post_id
WHERE a.post_type="product"
AND m1.meta_key='_sku'
AND m2.meta_key='_price'
Обратите внимание, что поле _price
соответствует “цене со скидкой” (если существует), поэтому вы можете также получить “списочную цену”:
SELECT a.post_title, m1.meta_value AS SKU, m2.meta_value AS SALE_PRICE, m3.meta_value AS LIST_PRICE
FROM wp_posts a
LEFT JOIN wp_postmeta m1
ON a.ID = m1.post_id
LEFT JOIN wp_postmeta m2
ON a.ID = m2.post_id
LEFT JOIN wp_postmeta m3
ON a.ID = m3.post_id
WHERE a.post_type="product"
AND m1.meta_key='_sku'
AND m2.meta_key='_price'
AND m3.meta_key='_regular_price'
Ответ или решение
Чтобы извлечь значения из столбца meta_value
для разных ключей meta_key
, в данном случае _sku
и _price
, из двух таблиц WordPress — wp_posts
и wp_postmeta
, необходимо воспользоваться SQL-запросами с использованием JOIN
. Правильная структура запросов обеспечит получение корректных данных. Давайте разберем предложенные решения и объясним, как они работают.
Разбор и объяснение запросов
Базовый запрос
Представленный изначальный запрос имеет следующую форму:
SELECT a.post_title, m1.meta_value AS SKU, m2.meta_value AS PRICE
FROM wp_posts a
LEFT JOIN wp_postmeta m1
ON a.ID = m1.post_id
LEFT JOIN wp_postmeta m2
ON a.ID = m2.post_id
WHERE a.post_type="product"
AND m1.meta_key='_sku'
AND m2.meta_key='_price';
Объяснение:
-
JOIN: Используется два
LEFT JOIN
для соединения таблицыwp_posts
с двумя экземплярами таблицыwp_postmeta
, позволяя получить несколько значенийmeta_value
для одного поста. -
Условие отбора: Условия
m1.meta_key='_sku'
иm2.meta_key='_price'
гарантируют, что из таблицыwp_postmeta
будут отобраны только те строки, которые содержат необходимые мета-ключи —_sku
и_price
соответственно. -
Результат: Этот запрос вернет список товаров с их названиями (
post_title
), артикулом (SKU
) и ценой (PRICE
).
Дополнительный Перечень Цены
Также возможно извлечение "обычной" (или листовой) цены с помощью добавления ещё одного JOIN
:
SELECT a.post_title, m1.meta_value AS SKU, m2.meta_value AS SALE_PRICE, m3.meta_value AS LIST_PRICE
FROM wp_posts a
LEFT JOIN wp_postmeta m1
ON a.ID = m1.post_id
LEFT JOIN wp_postmeta m2
ON a.ID = m2.post_id
LEFT JOIN wp_postmeta m3
ON a.ID = m3.post_id
WHERE a.post_type="product"
AND m1.meta_key='_sku'
AND m2.meta_key='_price'
AND m3.meta_key='_regular_price';
Объяснение:
- Третье соединение и условие: Добавление
LEFT JOIN wp_postmeta m3
и условияAND m3.meta_key='_regular_price'
позволяет также получить "листовую" цену для каждого товара.
Заключение
Важно отметить, что использование LEFT JOIN
позволяет включить строки из wp_posts
, даже если в wp_postmeta
не найдется соответствующих мета-значений. Это может быть полезно для получения полного перечня товаров, включая те, для которых отсутствуют заданные мета-данные.
При реализации данных запросов необходимо убедиться, что структура базы данных и именование столбцов точно соответствуют приведённым примерам, иначе существует риск возникновения ошибок или некорректных результатов. Это критично для структуры WordPress, адекватного функционирования интернет-магазинов и сайтов, использующих мета-информацию.
Эти пояснения помогут вам создать более точные и оптимизированные запросы к базе данных WordPress, что, в свою очередь, улучшит обработку данных и производительность вашего приложения или веб-сайта.