1

我喜欢 LEFT JOIN 两个表 wp_posts 和 wp_postmeta。在我的帖子中,我创建了几个元框选项。

假设我创建了一个名为“广告”的自定义帖子类型,对于每个广告,我都有发布日期和到期日期作为元选项。

问题是,我如何加入这两个表,以便从 wp_posts 表中获取帖子的 ID,其中当前日期高于帖子元表中的开始日期并且低于帖子中的到期日期元表。

对于非 WP 用户,wp_posts 表是一个传统表,其中每一行代表一个帖子,而 wp_postmeta 是一个键值分析表,其中基于帖子 id,包含多行来描述帖子的元选项。

有没有办法在单个 MySQL Query 中进行该查询?

亲切的问候。

4

1 回答 1

2

我认为您的意思是“开始日期”是“publication_date”。

如果没有模式定义,我会猜测列名和数据类型

一种方法是在 EXISTS 谓词中使用相关子查询,尽管这可能不是最有效的方法:

SELECT p.id
  FROM wp_posts p
 WHERE EXISTS
       ( SELECT 1
           FROM wp_postmeta m1
          WHERE m1.wp_posts_id = p.id
            AND m1.meta_option_name = 'publication date'
            AND m1.meta_option_date_value <= NOW()
       )
   AND EXISTS
       ( SELECT 1
           FROM wp_postmeta m2
          WHERE m2.wp_posts_id = p.id
            AND m2.meta_option_name = 'expiration date'
            AND m2.meta_option_date_value > NOW()
       )

您特别询问了使用 LEFT JOIN

使用 LEFT JOIN 操作可以获得等效的结果(尽管此查询实际上等同于进行 INNER JOIN 操作):

SELECT p.id
  FROM wp_posts p
  LEFT
  JOIN wp_postmeta m1
    ON m1.wp_posts_id = p.id 
   AND m1.meta_option_name = 'publication date'
   AND m1.meta_option_date_value <= NOW()
  LEFT 
  JOIN wp_postmeta m2
    ON m2.wp_posts_id = p.id
   AND m2.meta_option_name = 'expiration date'
   AND m2.meta_option_date_value > NOW()
 WHERE m1.id IS NOT NULL
   AND m2.id IS NOT NULL
 GROUP 
    BY p.id 
于 2013-02-07T23:06:38.570 回答