我喜欢LEFT JOIN两个表,wp_posts和wp_postmeta。在我的帖子中,我创建了几个元框选项。
假设我创建了一个名为“广告”的自定义帖子类型,并且对于每个广告,我将发布日期和到期日期作为元选项。
问题是,如何从wp_posts表中加入这两个表,以获取帖子的ID,其中当前日期高于post元表中的开始日期且低于到期日期在后元表中。
对于非WP用户,wp_posts表是一个传统的表,其中每一行代表一个帖子,wp_postmeta是一个键值pare表,其中基于post id,包含多行来描述帖子的meta选项
有没有办法在单个MySQL查询中进行查询?
亲切的问候。答案 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