ZANIN блог
Контакты
Крути вниз
Фильтр по:
//Post title

MySQL - пример JOIN по таблицам Wordpress с назначением дефолтных значений

03 Апр 2021Категория : MySQL

MySQL - пример JOIN по таблицам Wordpress с назначением дефолтных значений

Данный пример сделан на основе таблиц Wordpress. При объединении необходимо было выбрать товары (записи из wp_posts: post_type = product) и для каждой записи мета из таблицы wp_postmeta. Но у некоторых товаров отсутствовал тот или иной ключ в таблице wp_postmeta. Для тех, кто не знаком с Wordpress, то в таблице wp_postmeta есть 4 колонки, две колонки это ID мета и записи из wp_posts, а две другие это meta_key и meta_value. Так вот если не у всех записей проставлен какой-либо meta_key, тогда товар в выборку не попадет. Но нам же надо, чтобы он попал в нашу выборку хотя бы с дефолтным значением для ключа, которого не существует.

Для этого можно воспользоваться следующим приемом:

 

SELECT posts.ID                                                                                          AS id,
       MAX(unix_timestamp(posts.post_modified_gmt))                                                      AS modified_unix,
       MAX(posts.post_title)                                                                             AS name,
       MAX(posts.post_name)                                                                              AS slug,
       MAX(IF(wpm.meta_key = '_product_classification', IFNULL(wpm.meta_value, wpm.meta_value), ''))     AS subtitle,
       MAX(IF(wpm.meta_key = '_product_collection', IFNULL(wpm.meta_value, wpm.meta_value), 0))          AS collection_id,
       MAX(IF(wpm.meta_key = '_product_interior', IFNULL(wpm.meta_value, wpm.meta_value),0))             AS interior_photos,
       MAX(IF(wpm.meta_key = '_crosssell_ids', IFNULL(wpm.meta_value, wpm.meta_value),0))                AS crosssell_ids,
       MAX(IF(wpm.meta_key = '_upsell_ids', IFNULL(wpm.meta_value, wpm.meta_value), 0))                  AS upsell_ids,
       MAX(IF(wpm.meta_key = '_default_attributes', IFNULL(wpm.meta_value, wpm.meta_value),0))           AS default_attributes,
       MAX(IF(wpm.meta_key = '_product_attributes', IFNULL(wpm.meta_value, wpm.meta_value),0))           AS product_attributes,
       MAX(IF(wpm.meta_key = '_default_variation_id', IFNULL(wpm.meta_value, wpm.meta_value),0))         AS default_variation_id,
       MAX(category.term)                                                                                AS category
from wp_posts AS posts
         left join wp_postmeta wpm on (posts.ID = wpm.post_id)
         left join (SELECT wtr.object_id        as id,
                           wtr.term_taxonomy_id as term
                    FROM wp_term_relationships wtr
                             LEFT JOIN wp_term_taxonomy wtt on wtr.term_taxonomy_id = wtt.term_taxonomy_id
                    WHERE wtt.taxonomy = 'product_cat'
                      AND wtr.term_taxonomy_id = (
                        SELECT taxonomy.term_id AS term_id
                        FROM wp_term_taxonomy AS taxonomy
                                 LEFT JOIN wp_term_relationships AS relations
                                           ON (relations.term_taxonomy_id = taxonomy.term_taxonomy_id)
                                 LEFT JOIN wp_posts AS posts ON (posts.ID = relations.object_id)
                        WHERE taxonomy.taxonomy = 'product_cat'
                          AND posts.post_type = 'product'
                          AND post_status = 'publish'
                          AND object_id = wtr.object_id
                        ORDER BY parent DESC
                        LIMIT 1
                    )) AS category
                   ON (category.id = posts.ID)
where posts.post_status = 'publish'
  and posts.post_type = 'product'
group by posts.ID

Все строки в SELECT оборачиваем в MAX, кроме строки по которой делаем group by. А дальше, вот такие строки: MAX(IF(wpm.meta_key = '_product_classification', IFNULL(wpm.meta_value, wpm.meta_value), '')) AS subtitle - это означает, что если в meta_key нет ключа с именем _product_classification, то будет по дефолту значение у колонки subtitle станет ''.

Все довольно просто, хоть и не часто нужно.

  • 687

01. Об авторе

Александр Занин

Занимаюсь разработкой на Django,
а также бэкенд разработкой на PHP (Laravel, Slim).

Find on :

02. Свежие статьи

03. Категории

Готовы заказать проект?

© ZANIN 2019 / All rights reserved.
Контакты
Close