【问题标题】:Where condition based on count of results条件基于结果计数
【发布时间】:2019-10-26 07:10:25
【问题描述】:

我正在根据控制器的请求加载区域。可以通过路径或域找到区域。例如,https://example.com/zone123 可以返回两个区域,一个配置了域 example.com,另一个配置了路径 zone123

zones = Zone.where("path = ? OR domain = ?", request.path, request.server_name)

区域也有一个#public 标志。当我只找到一个区域(通过域或路径)时,我不在乎这个公共标志。但是当我找到两个区域时,我想确保其中至少一个将#public 标志设置为true

我可以很容易地在 ruby​​ 中做到这一点

if zones.count > 1 && zones.any?(&:public?)
  # do stuff
end

但是,有没有办法在 MySQL 中的单个查询中实现这一点? 我想我必须使用子查询,但我不确定如何根据数字添加另一个条件上一次选择返回的结果。

【问题讨论】:

    标签: mysql ruby-on-rails activerecord


    【解决方案1】:

    我不知道 RoR 语法,但用于此的 SQL 语法将在子查询中使用带有 HAVINGEXISTS 测试。

    SELECT columns
    FROM Zone
    WHERE path = ? OR domain = ?
    AND EXISTS (
        SELECT 1
        FROM Zone
        WHERE path = ? OR domain = ?
        HAVING COUNT(*) = 1 OR MAX(public) = 1
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-13
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多