我喜欢左接两张桌子,wpúposts和wpúpostemta。在我的文章中,我创建了几个元框选项。
假设我创建了一个名为“ads”的自定义post类型,并且对于每个广告,我都将发布日期和到期日期作为meta选项。
问题是,如何连接这两个表,以便从wp_posts表中获取post的ID,其中当前日期高于post元表中的开始日期,低于post元表中的到期日期。
对于非WP用户,WP_posts表是一个传统的表,其中每一行表示一个post,WP_postemta是一个键值pare表,其中基于post id,包含多行来描述post的元选项。
有没有办法在一个MySQL查询中进行该查询?
谨致问候。

最佳答案

我认为“开始日期”是指“出版日期”。
如果没有模式定义,我将猜测列名和数据类型
一种方法是在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()
       )

你特别问过关于使用左连接的问题
使用左连接操作可以获得等效的结果(尽管此查询实际上相当于执行内部连接操作):
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

07-27 14:53