MySQL | LEFT JOIN wp_posts和wp_postmeta

时间:2013-02-07 22:55:11

标签: mysql sql wordpress left-join

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

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

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

对于非WP用户,wp_posts表是一个传统的表,其中每一行代表一个帖子,wp_postmeta是一个键值pare表,其中基于post id,包含多行来描述帖子的met​​a选项

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

亲切的问候。

1 个答案:

答案 0 :(得分:1)

我接受你的意思是“开始日期”是“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