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

标签 mysql database woocommerce inner-join

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

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

产品和产品变体都是具有关联帖子元帖子
示例架构:

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'

我相信我的连接方式是错误的。任何指导表示赞赏。

最佳答案

这个过程非常复杂,因为幕后发生了很多事情。在我的一个项目中,我必须根据某个属性获取所有帖子 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'

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

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

希望这对您有帮助。

关于连接父列并具有多个内部连接的mysql查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29907140/

相关文章:

c# - 使用未分配的局部变量(插入数据库)

mongodb - 在 mongodb 中的多个字段上执行不同

php - WooCommerce - 仅选择一个属性时更改产品图像?

javascript - 获取当前值输入字段数量 Woocommerce

Python:Flask request.args.get 表中包含空值

mysql - 合并 2 个表中的数据?

php - 更改密码 PHP/Ajax/JQuery

php - Codeigniter - 如果用户在数据库中创建了条目,则仅允许用户从数据库中删除

mysql - 在本地主机上使用 OpenSSL 连接到 MySql 数据库

wordpress - 向 Woocommerce cookie 添加安全属性