社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

php-mysql联合查询

rwchampin • 5 年前 • 1546 次点击  

我对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
 
1546 次点击  
文章 [ 1 ]  |  最新文章 5 年前
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

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