从日期范围中选择不同的列值

时间:2015-07-23 23:17:40

标签: mysql sql

我创建了一个sqlfiddle,概述了我尝试做的事情:

http://sqlfiddle.com/#!9/41f3c/2

基本上,我需要在包含元信息的表中搜索唯一帖子。在这个例子中的元是一系列代表排除的日期(想想酒店的预订系统)。

我传递了开始和结束日期。我想找到不包含该范围内日期的post_id。我已经关闭了,但无法弄清楚。

SELECT DISTINCT post_id 
FROM wp_facetwp_index
WHERE facet_name = 'date_range'
AND facet_value NOT BETWEEN '$start_date' AND '$end_date'

如果表中唯一排除的日期在范围内,但是如果某些日期超出范围,我仍然可以获得post_id。

感谢您的光临。

1 个答案:

答案 0 :(得分:1)

不要忘记,在SQL中,过滤器(where子句等)是基于RECORD应用的。每条记录都与其他记录独立评估。

所以,因为

(1, 511, 'date_range', 'cf/excluded_dates', '2015-07-31', '2015-07-31')

验证您的情况,返回511

由于post_id不是唯一的,因此您需要在SETS上进行排除,而不是在您正在进行的RECORDS上排除。

以下是解决方案(此处调整了小提琴:http://sqlfiddle.com/#!9/41f3c/7

SELECT DISTINCT i1.`post_id` 
FROM `wp_facetwp_index` i1
WHERE i1.`facet_name` = 'date_range'
AND NOT EXISTS (
    SELECT 1
    FROM `wp_facetwp_index` i2
    WHERE 
        i2.`facet_value` BETWEEN '$start_date' AND '$end_date'
    AND i2.`facet_name` = 'date_range'
    AND i2.`post_id` = i1.`post_id`
)

EXISTS (之后的子查询是行的子集。它将根据NOT EXISTS = i2.post_id的{​​{1}}进行评估。 这是一个消极的交集。

如果您需要识别的元组不是唯一的,那么处理排除记录是行不通的。