条件取决于结果数

时间:2019-10-26 07:10:25

标签: mysql ruby-on-rails activerecord

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

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

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

我可以很容易地在红宝石中做到这一点

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

但是,有没有一种方法可以在MySQL中的单个查询中实现此目标?我猜我必须使用子查询,但是我不确定如何根据数字添加另一个条件前一次选择返回的结果的结果。

1 个答案:

答案 0 :(得分:1)

我不知道RoR语法,但是SQL语法将在子查询中对EXISTS使用HAVING测试。

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
)