光滑计数(.length / .size)不能按预期工作

时间:2015-09-28 15:25:32

标签: mysql scala slick

我正在使用以下Slick代码来实现SQL语句。

SQL

SELECT device.*, COUNT(unit.id) AS cnt 
FROM device LEFT JOIN unit ON device.id = unit.device_id GROUP BY device.id;

Scala Slick

def devicesWithUnitCount = for {
    (device, unit) <- TableQuery[TDDevice] joinLeft TableQuery[TDUnit] 
                                           on (_.id === _.deviceID) 
                                           groupBy (_._1)
} yield (device, unit.size)

示例模式,我无法让查询在那里工作,但它在我的服务器上运行。 http://sqlfiddle.com/#!9/0f335

但是,与正确返回0的SQL语句不同,即使单元中没有关联的行,光滑的实现也会产生1的计数。

我已经认为这是我要求帮助的SQL语句(Get count of rows in table A that have a reference to table B)并且被告知SQL语句应该正常工作(双重检查,并确认它有效)。现在在这个答案的帮助下,我现在知道我的Slick实现是错误的,我的问题是如何修复光滑的查询。

提前致谢。

1 个答案:

答案 0 :(得分:2)

请参阅groupBy的Slick文档,其中包含:

  

groupBy调用必须后跟地图调用

所以我想这会为你做到这一点:

 def devicesWithUnitCount = (
    TableQuery[TDDevice] joinLeft TableQuery[TDUnit] 
      on (_.id === _.deviceID) ) 
    .groupBy (_._1)
    .map{ case (grouped, all) => (grouped, all.map(_._2).size) }