Slick count (.length / .size) 没有按预期工作
Slick count (.length / .size) doesn't work as expected
我正在使用以下 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 语句,所以我寻求帮助 () 并被告知 SQL 语句应该可以正常工作(仔细检查并确认它有效)。现在,在那个答案的帮助下,我现在知道我的 Slick 实现肯定是错误的,我的问题是如何修复 slick 查询。
提前致谢。
请参阅 groupBy 的 Slick 文档,其中说:
a groupBy call must be followed by a map call
所以我想这对你有用:
def devicesWithUnitCount = (
TableQuery[TDDevice] joinLeft TableQuery[TDUnit]
on (_.id === _.deviceID) )
.groupBy (_._1)
.map{ case (grouped, all) => (grouped, all.map(_._2).size) }
我正在使用以下 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 语句,所以我寻求帮助 (
提前致谢。
请参阅 groupBy 的 Slick 文档,其中说:
a groupBy call must be followed by a map call
所以我想这对你有用:
def devicesWithUnitCount = (
TableQuery[TDDevice] joinLeft TableQuery[TDUnit]
on (_.id === _.deviceID) )
.groupBy (_._1)
.map{ case (grouped, all) => (grouped, all.map(_._2).size) }