Есть ли лучший способ использования GROUP_CONCAT () для этого конкретного запроса? - PullRequest
0 голосов
/ 24 мая 2019

Проблема с таксономиями в WordPress

При работе с таксономиями Wordpress и WooCommerce возникли некоторые проблемы. По крайней мере, я хочу, чтобы четыре таблицы дали мне правильные данные, которые мне нужны. Мои знания о MYSQL очень просты - после двух дней чтения я не могу понять, как написать правильный запрос!

База данных

woocommerce_attribute_taxonomies
+----------------+------------------+-----------------+
| attribute_id   | attribute_name   | attribute_label |
+----------------+------------------+-----------------+
|              7 | height           | Height          |
+----------------+------------------+-----------------+
|              2 | color            | Color           |
+----------------+------------------+-----------------+

term_taxonomy
+------+------------------+-----------------+
| id   | taxonomy         | term_id         |
+------+------------------+-----------------+
|   36 | pa_color         | 30              |
+------+------------------+-----------------+
|   36 | pa_height        | 31              |
+------+------------------+-----------------+

terms
+---------+-------------+
| term_id | name        |
+---------+-------------+
|      72 | Group 1     |
+---------+-------------+
|      73 | Group 2     |
+---------+-------------+


termmeta
+---------+-----------+-----------------+------------+
| term_id | meta_id   | meta_key        | meta_value |
+---------+-----------+-----------------+------------+
|      66 |        72 | _wcga_taxonomie |          7 |
+---------+-----------+-----------------+------------+
|      67 |        72 | _wcga_taxonomie |          2 |
+---------+-----------+-----------------+------------+
|      68 |        73 | _wcga_taxonomie |          2 |
+---------+-----------+-----------------+------------+

Мой запрос

Вот так выглядит мой запрос ..

SELECT tm.term_id
     , meta_id
     , name
     , GROUP_CONCAT(attribute_label) AS wc_attr_label
     , GROUP_CONCAT(meta_value) AS wc_attr_tax
  FROM {$wpdb->prefix}termmeta AS tm
  JOIN {$wpdb->prefix}terms AS t 
    ON t.term_id = tm.term_id
  JOIN {$wpdb->prefix}woocommerce_attribute_taxonomies AS wct 
    ON wct.attribute_id = tm.meta_value
 WHERE tm.meta_key = '_wcga_taxonomie'
 GROUP 
    BY t.term_id

Результаты вышеуказанного запроса

Array
(
    [grouped_attributes] => Array
        (
            [0] => stdClass Object
                (
                    [term_id] => 72
                    [meta_id] => 66
                    [name] => Gruppe 1
                    [wc_attr_label] => Height,Color
                    [wc_attr_tax] => 7,2
                )

            [1] => stdClass Object
                (
                    [term_id] => 73
                    [meta_id] => 68
                    [name] => Gruppe 2
                    [wc_attr_label] => Color
                    [wc_attr_tax] => 2
                )

        )

)

лично мне не нравится способ использования GROUP_CONCAT, он думает, что было бы намного лучше, если бы все значения были доступны легко и чисто, насколько это возможно.

Можно ли установить дополнительные объекты, заключенные в массив внутри [атрибутов], не выполняя еще один запрос?

Что мне нужно?

Array
(
    [grouped_attributes] => Array
        (
            [0] => stdClass Object
                (
                    [term_id] => 72
                    [meta_id] => 66
                    [name] => Group 1
                    [attributes] => Array( Data from woocommerce_attribute_taxonomies )
                )

            [1] => stdClass Object
                (
                    [term_id] => 73
                    [meta_id] => 68
                    [name] => Group 2
                    [attributes] => Array( Data from woocommerce_attribute_taxonomies )

                )

        )

)

Если у anybode есть лучшие идеи, как это сделать, я был бы очень признателен!

EDIT Дополнительная информация

Версия MySQL -> 5.6.38nmm-1log

ONLY_FULL_GROUP_BY не знаю, как это проверить, я читаю atm!

SHOW CREATE TABLE `d02dbcff`.`a335s_termmeta`; 

SELECT `meta_id`
     , `term_id`
     , `meta_key`
     ,  LEFT(`meta_value`, 256) 
  FROM `d02dbcff`.`a335s_termmeta` 
 LIMIT 1000;

SHOW CREATE TABLE `d02dbcff`.`a335s_terms`; 

SELECT * 
  FROM `d02dbcff`.`a335s_terms` 
 LIMIT 1000;

SHOW CREATE TABLE `d02dbcff`.`a335s_term_taxonomy`; 
SELECT `term_taxonomy_id`
     , `term_id`
     , `taxonomy`
     ,  LEFT(`description`,256)
     , `parent`
     , `count` 
  FROM `d02dbcff`.`a335s_term_taxonomy` 
 LIMIT 1000;

SHOW CREATE TABLE `d02dbcff`.`a335s_woocommerce_attribute_taxonomies`;
SELECT * 
  FROM `d02dbcff`.`a335s_woocommerce_attribute_taxonomies`
 LIMIT 1000;

При условии MCVE

http://sqlfiddle.com/#!9/5aa11/5

...