PHP MYSQL Union Query - PullRequest
       4

PHP MYSQL Union Query

1 голос
/ 17 марта 2019

Я новичок в MySQL запросах, и у меня возникли проблемы с получением структуры данных, которую я хочу.Я надеюсь, что один из вас, ребята, может помочь.

У меня есть следующий запрос:

SELECT *
FROM wp_postmeta
WHERE post_id IN (SELECT id from wp_posts WHERE post_type = 'product')

, который просто собирает все данные из таблицы 2, которые имеют тот же идентификатор, что и продукт в таблице 1Проблема в том, что результаты возвращаются в виде:

{meta_id: "37230", post_id: "2549", meta_key: "total_sales", meta_value: "0"}
{meta_id: "37231", post_id: "2549", meta_key: "_virtual", meta_value: "no"}
{meta_id: "37232", post_id: "2549", meta_key: "_tax_status", meta_value: "taxable"}
{meta_id: "37233", post_id: "2549", meta_key: "_visibility", meta_value: "visible"}
{meta_id: "37234", post_id: "2549", meta_key: "_featured", meta_value: "no"}
{meta_id: "37235", post_id: "2549", meta_key: "_weight", meta_value: "0.50"}
{meta_id: "37236", post_id: "2549", meta_key: "_sku", meta_value: "HCS-DGMP"}
{meta_id: "37237", post_id: "2549", meta_key: "_product_attributes", meta_value: "a:0:{}"}
{meta_id: "37238", post_id: "2549", meta_key: "_regular_price", meta_value: "18.99"}
{meta_id: "37239", post_id: "2549", meta_key: "_sale_price", meta_value: ""}

Как видите, все они имеют одинаковый идентификатор сообщения, но возвращаются в отдельных объектах.Как я могу изменить свой запрос выше, чтобы все это возвращалось в одном объекте?Я также буду удалять meta_id, так как он бесполезен.

1 Ответ

0 голосов
/ 17 марта 2019

Поскольку MySQL 5.7.22 , вы можете использовать JSON_OBJECTAGG(key, value):

SELECT post_id, JSON_OBJECTAGG(meta_key, meta_value) AS meta_data
FROM wp_postmeta
WHERE post_id IN (SELECT id from wp_posts WHERE post_type = 'product')
GROUP by post_id

Это вернет meta_data как JSON_OBJECT с key: value парами:

post_id | meta_data
   2549 | {"_sku": "HCS-DGMP", "_weight": "0.50", "_virtual": "no", "_featured": "no", "_sale_price": null, "_tax_status": "taxable", "_visibility": "visible", "total_sales": "0", "_regular_price": "18.99", "_product_attributes": "a:0:{}"}

Демо

Если ваш сервер не поддерживает JSON_OBJECTAGG(), я бы использовал PHP-решение:

$postIds = array_unique(array_column($dbResult, 'post_id'));

$posts = [];
foreach ($postIds as $id) {
    $posts[$id] = (object)['id' => $id];
}

foreach ($dbResult as $row) {
    $posts[$row->post_id]->{$row->meta_key} = $row->meta_value;
}

echo json_encode(array_values($posts), JSON_PRETTY_PRINT);

Результат:

[
    {
        "id": "2549",
        "total_sales": "0",
        "_virtual": "no",
        "_tax_status": "taxable",
        "_visibility": "visible",
        "_featured": "no",
        "_weight": "0.50",
        "_sku": "HCS-DGMP",
        "_product_attributes": "a:0:{}",
        "_regular_price": "18.99",
        "_sale_price": ""
    }
]

Демо

Пока вы не обрабатываете тысячи строк, я не буду беспокоиться о производительности.

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