连接父列并具有多个内部联接的mysql查询

时间:2015-04-27 22:33:18

标签: mysql database woocommerce inner-join

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

基本上我需要在没有特定变化的情况下抓取所有产品,而且我在加入ID时遇到问题。

产品和product_variation都是帖子以及关联的 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'

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

2 个答案:

答案 0 :(得分:0)

这个过程非常复杂,因为很多事情都在幕后进行。在我的一个项目中,我必须根据某个属性获取所有post 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可以覆盖它。只是为了让你知道。

希望这对你有所帮助。

答案 1 :(得分:0)

我把它解决了,这就是我需要的东西

f = open('record.txt', 'rb')
for line in f:
    print line