【问题标题】:SQL Statement - SELECT the inverse of this querySQL 语句 - 选择此查询的逆
【发布时间】:2013-10-30 12:54:44
【问题描述】:

我有这个查询,我想选择与该选择相反的内容。

SELECT Guide.id FROM Guide
INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId
WHERE GuideAvailability.startDate IN (1377946800)
GROUP BY GuideAvailability.guideId
HAVING COUNT(DISTINCT GuideAvailability.id) = 1

有没有简单的方法可以解决我的问题?

【问题讨论】:

  • 定义“逆”?举个例子。
  • 这取决于你所说的逆。一个答案是将“IN”更改为“NOT IN”。另一个答案是将“HAVING ... = 1”更改为“HAVING ... 1”。或者两者都做。你想要什么?
  • 此查询返回与我的条件相对应的指南的 id。我想获取除此查询中选择的指南之外的所有指南

标签: mysql sql inverse-transform


【解决方案1】:

只需使用这个查询:

SELECT * 
     FROM Guide where id NOT IN (
       SELECT Guide.id 
         FROM Guide
         INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId
         WHERE GuideAvailability.startDate IN (1377946800) 
         GROUP BY GuideAvailability.guideId 
         HAVING COUNT(DISTINCT GuideAvailability.id) = 1
      )

【讨论】:

  • MySQL 中没有“EXCEPT”吗?我相信 NOT IN 会给你一些性能问题
  • @Schalk 不,mysql中没有这样的东西
【解决方案2】:

也许你正在寻找这个

SELECT Guide.id FROM Guide
INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId
WHERE GuideAvailability.startDate NOT IN (1377946800) GROUP BY GuideAvailability.guideId HAVING COUNT(DISTINCT GuideAvailability.id) <> 1

【讨论】:

    【解决方案3】:

    您可以翻转布尔值。 ;)

    当我有大量 where 过滤器并且有一组特定的排除过滤器时,我会这样做。我把它们写在箱子里,然后=1 排除,=0 查找我排除的内容。

    SELECT Guide.id FROM Guide
    INNER JOIN GuideAvailability ON Guide.id = GuideAvailability.guideId
    WHERE ( case when GuideAvailability.startDate IN (1377946800) then 1 else 0 end) = 0
    GROUP BY GuideAvailability.guideId
    HAVING COUNT(DISTINCT GuideAvailability.id) = 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 1970-01-01
      • 2017-04-23
      • 2020-04-18
      • 2011-01-03
      相关资源
      最近更新 更多