Py学习  »  DATABASE

php-mysql联合查询

rwchampin • 6 年前 • 1615 次点击  

我对MySQL查询不熟悉,在获取我想要的数据结构时遇到问题。我希望你们中的一个能帮忙。

我有以下问题:

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

它只从表2中获取与表1中的产品具有相同ID的所有数据。问题是结果返回为:

{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: ""}

正如您所看到的,它们都具有相同的post id,但在不同的对象中返回。如何修改上面的查询,使所有查询都返回到一个对象中?我也会把 meta_id 因为它是无用的。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39133
 
1615 次点击  
文章 [ 1 ]  |  最新文章 6 年前
Paul Spiegel
Reply   •   1 楼
Paul Spiegel    6 年前

自从 MySQL5.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_对象 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:{}"}

Demo

如果服务器不支持 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": ""
    }
]

Demo

只要您不处理数千行,我就不会担心性能。