【问题标题】:Multiple Join between two tables - Wordpress两个表之间的多重连接 - Wordpress
【发布时间】:2019-02-25 10:09:04
【问题描述】:

我需要创建 SQL 来检索所有自定义帖子类型“项目”及其所有值。 这是表结构

POSTS 表

|| *id*|| *post_title*                  || *post_name*       || *post_type*
|| 550 || Brand Test 04                 || brand-test-04     || brands 
|| 579 || 200 ml / 6.8 oz               || 200-ml-6-8-oz     || sizes 
|| 758 || Item recor 8doem recordado 88 || item-recordado-88 || item

POSTMETA 表:

|| *post_id*    || *meta_key*       || *meta_value*
|| 758          || basicName        || Item recor 8doem recordado 88
|| 758          || basicBrandName   || 550
|| 758          || basicSize        || 579

我目前的查询是: 在这个查询中,我在表之间进行了连接,以从表 POSTS 中检索 post(post_type 'item') 并将其与 POSTMETA 上的相关值相关联。 我将 POSTMETA 的值从 meta_key/meta_value 列拆分为每个项目的一列。

SELECT
    p.ID,
    p.post_title,
    p.post_name,
    MAX(case when pm.meta_key = 'basicBrandName' then pm.meta_value end) as idBrand,
    MAX(case when pm.meta_key = 'basicSize' then pm.meta_value end) as idSize
from xyz_posts p
inner join xyz_postmeta pm
    on p.ID = pm.post_id
where
    p.post_type = 'item'    and
    p.post_status = 'publish'

group by p.ID

查询返回这个结构:

|| *ID*|| *post_title*            || *post_name*             || *idBrand*|| *idSize*
|| 758 || Item recordado 88 Item  || item-recordado-88       || 550      || 579 

我需要调整查询以返回此结构:

|| *id*  || *post_title*            || *post_name*          || *brand_title* || *brand_name*   || *size_title*     || *size_name*
|| 758   || Item recordado 88 Item  || item-recordado-88    || Brand Test 04 || brand-test-04  || 200 ml / 6.8 oz  || 200-ml-6-8-oz

我尝试了内连接、左连接等,但没有成功。
如果有人可以提供帮助,我将不胜感激。

【问题讨论】:

  • 您当前的查询在我看来完全正确。仅添加新的最大 CASE 表达式以覆盖您希望出现在输出中的新列有什么问题?
  • @TimBiegeleisen 如果我只输入一个新的最大 case 表达式,它将返回 null。因为我需要在两个表之间进行其他联接(我尝试过但没有成功)。
  • 从您的数据中不清楚您要在这里做什么。考虑将您的示例数据简化为一两个帖子,并显示准确的输入和输出。如果此处涉及另一个表/连接,则也显示。
  • @TimBiegeleisen,你能再看看这些问题吗?不,我认为它更清楚。谢谢

标签: mysql wordpress


【解决方案1】:

一种方法是将posts 表连接到postmeta 上的单独数据透视子查询。然后,再对posts 进行两次连接,以引入您需要的信息。

SELECT
    p1.id,
    p1.post_title,
    p1.post_name,
    COALESCE(p2.post_title, 'NA') AS brand_title,
    COALESCE(p2.post_name, 'NA') AS brand_name,
    COALESCE(p3.post_title, 'NA') AS size_title,
    COALESCE(p3.post_name, 'NA') AS size_name
FROM posts p1
LEFT JOIN
(
    SELECT
        post_id,
        MAX(CASE WHEN meta_key = 'basicBrandName' THEN meta_value END) AS idBrand,
        MAX(CASE WHEN meta_key = 'basicSize' THEN meta_value END) AS idSize
    FROM postmeta
    GROUP BY post_id
) pm
    ON p1.id = pm.post_id
LEFT JOIN posts p2
    ON pm.idBrand = p2.id
LEFT JOIN posts p3
    ON pm.idSize = p3.id
WHERE p1.id = 758;

Demo

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2012-04-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多