【问题标题】:Select distinct column value from date range从日期范围中选择不同的列值
【发布时间】:2015-07-23 23:17:39
【问题描述】:

我创建了一个 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。

感谢收看。

【问题讨论】:

  • 我删除了wordpress标签并添加了一个SQL标签,因为这个查询实际上是一个通用的sql问题。

标签: mysql sql


【解决方案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 = i1.post_id 否定评估。 这是一个负相交。

如果您需要识别的元组不是唯一的,则排除记录不起作用。

【讨论】:

  • 非常感谢!我现在正在测试这个。一旦我确认它可以正常工作,我就会接受这个答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多