【问题标题】:mysql query that joins a parent column and has multiple inner joins连接父列并具有多个内部连接的mysql查询
【发布时间】:2015-04-27 22:33:18
【问题描述】:

我正在使用 wordpress / woocommerce 数据库结构,并希望进行自定义查询。

基本上我需要获取所有没有特定变化的产品,但我在加入 ID 时遇到了麻烦。

product 和 product_variation 都是 posts 以及关联的 postmeta。
示例架构:

wp_posts                  wp_postmeta

ID                        post_id
post_parent               meta_key
post_type                 meta_value
post_status

wp_posts 表的示例如下所示:

id    name      post_parent    meta_key         meta_value
2     tshirt    null 
3     pants     null
4               2              variation_type   red
5               2              variation_type   blue

这里你可以看到 4 个帖子; 2 种产品和 2 种变体。变体的 post_parent 指向产品。所以我有一件红色和蓝色的T恤

我需要的是获取所有带有蓝色变体的产品,这意味着我需要将 post_parent 加入到 id。

这是我目前所拥有的。

SELECT * FROM wp_posts wp1
  INNER JOIN wp_postmeta pm1 
    ON (pm1.post_id = wp1.ID)
  INNER JOIN wp_postmeta pm2 
    ON (pm2.post_id = wp1.ID)
  JOIN wp_posts wp2 
    ON (wp2.post_parent = wp1.ID)
      AND wp1.post_type   = 'product_variation'
      AND wp1.post_status = 'publish'
      AND pm1.meta_key    = 'groups-groups_read_post' 
      AND pm1.meta_value  = 'vet_read'
      AND pm2.meta_key    = 'variation_type' 
      AND pm2.meta_value  = 'blue'

我相信我做错了连接。任何指导表示赞赏。

【问题讨论】:

  • 你能改变你的结构吗?

标签: mysql database woocommerce inner-join


【解决方案1】:

这个过程非常复杂,因为有很多事情发生在幕后。在我的一个项目中,我必须根据某个属性获取所有帖子 ID(主要产品 ID)。

SELECT
    DISTINCT p.post_parent FROM `wp_posts` AS p
LEFT JOIN
    `wp_postmeta` AS pm ON p.ID = pm.post_id
LEFT JOIN
    `wp_postmeta` AS pm2 ON p.ID = pm2.post_id
WHERE
    p.post_type = 'product_variation' AND
    (
        (pm.meta_key = 'attribute_pa_size' AND pm.meta_value = "XL") OR
        (pm.meta_key = 'attribute_size' AND pm.meta_value = "XL")
    )   AND
    pm2.meta_key = '_stock' AND pm2.meta_value != '0'

我有一个变体size,我想抓住有这个变体的产品,当然不会缺货。您会注意到我必须检查meta_key 两次,因为当您在产品编辑器页面中输入属性时,woocommerce 会将其存储为attribute_{$attribute_name} 并将其保存在属性部分。但是,如果您从先前保存的可用属性下拉列表中选择它,那么您必须查找attribute_pa_{$attribute_name}。我相信你可以根据你的要求修改这个SQL。

注意:如果您打算将此自定义查询与pre_get_posts 一起使用来设置post__in 参数,那么很遗憾它不起作用。 Woocommerce 有一个过滤器loop_shop_post_in 覆盖它。只是为了让您知道。

希望这对你有帮助。

【讨论】:

  • 感谢您的回复,我发布了一个对我有用的答案
【解决方案2】:

我解决了,这就是我需要的

SELECT wp_posts.* FROM wp_posts
        INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
        LEFT JOIN wp_posts p2 ON (wp_posts.ID = p2.post_parent) AND p2.post_type = 'product_variation'
        INNER JOIN wp_postmeta pm2 ON (pm2.post_id = p2.ID) AND pm2.meta_key = 'variation_type' and pm2.meta_value = 'blue'
        WHERE wp_posts.post_type = 'product'
        AND (wp_posts.post_status = 'publish')
        AND (wp_postmeta.meta_key = 'groups-groups_read_post')
        AND CAST(wp_postmeta.meta_value AS CHAR) = 'vet_read';

【讨论】:

  • 只是为了好奇 variation_type 是什么?
  • @maksbd19 只是我正在检查的实际变体类型的假占位符(它在 woocommerce 中被命名为不同的名称),很抱歉造成混淆。
猜你喜欢
  • 2014-08-28
  • 2012-04-21
  • 2019-05-29
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多