我喜欢左接两张桌子,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