Rails mysql - 在1个查询中计数2

时间:2015-03-26 15:16:36

标签: mysql ruby-on-rails select count

我已经检查了一些其他答案,但无法将它们应用于我的查询。我的家务活和完整的计数相互冲突。我已经尝试了SUM但是没有用。如果我删除对其他计数和相应表的引用,则两个计数都可以自行运行。

    @bays = Bay.
    select('COUNT(comp.id) as complete_count, COUNT(ch.count) as chore_count, comp.*, s.*, t.*, u.*, u.number as unit_number, b.*').
    from('bays b').
    joins('LEFT JOIN units u ON u.bay_id = b.id AND u.bay_id is not null').
    joins('LEFT JOIN sections s ON u.id = s.unit_id').
    joins('LEFT JOIN trades t ON s.trade_id = t.id AND t.production = 1').
    joins('LEFT JOIN completions comp ON t.id = comp.trade_id AND comp.unit_id = u.id').
    joins('LEFT JOIN chores ch ON t.id = ch.trade_id').
    joins('LEFT JOIN deficiencies d ON d.trade_id = t.id AND d.unit_id = u.id AND d.closed = 0').
    order("u.id, t.position").
    group("b.id, u.id, s.id, ch.id").
    group_by{|u| [u.id, u.number, u.unit_number]}

1 个答案:

答案 0 :(得分:1)

你必须计算两张桌子的明显价值。列:

@bays = Bay.
select('COUNT(DISTINCT comp.id) as complete_count, COUNT(DISTINCT ch.count) as chore_count, comp.*, s.*, t.*, u.*, u.number as unit_number, b.*').
from('bays b').
joins('LEFT JOIN units u ON u.bay_id = b.id AND u.bay_id is not null').
joins('LEFT JOIN sections s ON u.id = s.unit_id').
joins('LEFT JOIN trades t ON s.trade_id = t.id AND t.production = 1').
joins('LEFT JOIN completions comp ON t.id = comp.trade_id AND comp.unit_id = u.id').
joins('LEFT JOIN chores ch ON t.id = ch.trade_id').
joins('LEFT JOIN deficiencies d ON d.trade_id = t.id AND d.unit_id = u.id AND d.closed = 0').
order("u.id, t.position").
group("b.id, u.id, s.id, ch.id").
group_by{|u| [u.id, u.number, u.unit_number]}

基本上,COUNT将计算每个非空值。你加入表的方式,如果一个表的匹配记录比另一个表更多,它会迫使MySQL填补“更小”的漏洞。具有重复值的表。通过添加DISTINCT,您的计数将忽略这些值,从而为您提供正确的数字。