Woocommerce - Пользовательский MySQL Query - Получить продукты с несколькими значениями таксономий - PullRequest
0 голосов
/ 11 мая 2018

Я хочу написать собственный SQL-запрос для получения продуктов (записей с post_type = 'product') с двумя конкретными значениями в двух разных таксономиях.

По сути, я хочу получить продукты, которые имеют определенный цвет и относятся к определенной категории.

Обе таксономии можно найти здесь: enter image description here

Вот пример: я хотел бы получить все продукты, которые имеют зеленый цвет и относятся к категории платья

Я пробовал разные подходы. Позвольте мне провести вас через это.

Если я бегу:

SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term2.name = 'green' /* GREEN COLOUR */

Я получаю все продукты с атрибутом pa_colour = green, и это правильный результат.

Тогда, если я бегу:

SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term1.name = 'dresses' /* DRESSES CATEGORY */

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

ОДНАКО, когда я запрашиваю обе таксономии вместе, продукты не возвращаются:

SELECT
wp_vge8pp_posts.post_title, wp_term2.term_id
FROM wp_vge8pp_posts
LEFT JOIN wp_vge8pp_term_relationships
ON wp_vge8pp_term_relationships.object_id = wp_vge8pp_posts.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id
AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2
ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id
AND wp_tax2.taxonomy = 'pa_colour'
LEFT JOIN wp_vge8pp_terms wp_term1
ON wp_tax1.term_id = wp_term1.term_id
LEFT JOIN wp_vge8pp_terms wp_term2
ON wp_tax2.term_id = wp_term2.term_id
WHERE wp_vge8pp_posts.post_type = 'product'
AND wp_vge8pp_posts.post_status = 'publish'
AND wp_term2.name = 'green' /* GREEN COLOUR */
AND wp_term1.name = 'dresses' /* DRESSES CATEGORY */

Как я могу исправить запрос, чтобы получить продукты, которые имеют зеленый цвет и относятся к категории платья ?

Примечание. Если это полезно, приведем структуру БД для Woocommerce: http://www.webhat.in/article/woocommerce-tutorial/how-product-attribute-are-stored-in-database/

Ответы [ 2 ]

0 голосов
/ 12 мая 2018
SELECT p.post_title
     , t2.term_id
  FROM wp_vge8pp_posts p
  LEFT 
  JOIN wp_vge8pp_term_relationships tr
    ON tr.object_id = p.ID
  LEFT 
  JOIN wp_vge8pp_term_taxonomy tx1
    ON tx1.term_taxonomy_id = tr.term_taxonomy_id 
   AND tx1.taxonomy = 'product_cat' 

  LEFT 
  JOIN wp_vge8pp_term_taxonomy tx2
    ON tx2.term_taxonomy_id = tr.term_taxonomy_id 
   AND tx2.taxonomy = 'pa_colour' 

  LEFT 
  JOIN wp_vge8pp_terms t1
    ON t1.term_id = tx1.term_id 

    -- B

  LEFT 
  JOIN wp_vge8pp_terms wp_term2 t2
    ON t2.term_id = tx2.term_id  

    -- A

 WHERE p.post_type = 'product'
   AND p.post_status = 'publish'

   AND t2.name = 'green' /* GREEN COLOUR */        -- MOVE THIS LINE TO A
   AND t1.name = 'dresses' /* DRESSES CATEGORY */  -- AND THIS LINE TO B

Если вы все еще боретесь, см. Почему я должен предоставить MCVE для того, что мне кажется очень простым SQL-запросом

0 голосов
/ 12 мая 2018

Только что нашел решение, попробовав много разных способов:

SELECT DISTINCT wp1.post_title
FROM wp_vge8pp_posts wp1
LEFT JOIN wp_vge8pp_term_relationships ON wp_vge8pp_term_relationships.object_id = wp1.ID
LEFT JOIN wp_vge8pp_term_taxonomy wp_tax1 ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax1.term_taxonomy_id AND wp_tax1.taxonomy = 'product_cat'
LEFT JOIN wp_vge8pp_terms wp_term1 ON wp_tax1.term_id = wp_term1.term_id
WHERE wp1.post_type = 'product' AND wp1.post_status = 'publish'
AND wp_term1.name = 'dresses'

AND EXISTS (

    SELECT wp2.post_title
    FROM wp_vge8pp_posts wp2
    LEFT JOIN wp_vge8pp_term_relationships ON wp_vge8pp_term_relationships.object_id = wp2.ID
    LEFT JOIN wp_vge8pp_term_taxonomy wp_tax2 ON wp_vge8pp_term_relationships.term_taxonomy_id = wp_tax2.term_taxonomy_id AND wp_tax2.taxonomy = 'pa_colour'
    LEFT JOIN wp_vge8pp_terms wp_term2 ON wp_tax2.term_id = wp_term2.term_id
    WHERE wp_term2.name = 'green'
    AND wp1.ID = wp2.ID

)

В основном я выбрал все товары с категорией «Платья», а затем сузился, выбрав цвет «зеленый».

Хитрость для соединения обеих категорий заключалась в том, чтобы дважды ссылаться на таблицы (давая им разные имена), а затем соединять их в конце с идентификатором сообщения:

wp1.ID = wp2.ID

Также я добавил "DISTINCT"«чтобы убедиться, что на результатах нет повторяющихся продуктов.

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