【问题标题】:Implementing a complex left join in Scala Slick在 Scala Slick 中实现复杂的左连接
【发布时间】:2015-12-25 03:43:58
【问题描述】:

我正在搜索我在 stackoverflow (Get count of rows in table A that have a reference to table B) 上找到的特定 SQL

但是我似乎无法在 Slick 中实现这个 SQL 解决方案。

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

我目前的方法失败了

slick.SlickException: Unexpected node Select _2 -- SQL prefix: select x2.x3, x2.x4, x2.x5, x2.x6, 

尝试运行/编译查询时

val devicesWithUnitCountResult = dbConfig.db.run(TableQueries.devicesWithUnitCount.result)

当前代码:

  def unitCountPerDevice = for {
    (id, length) <- TableQuery[TDUnit].groupBy(k => k.deviceID).map(k => (k._1, k._2.map(_.id).length))
  } yield (id, length)

  def devicesWithUnitCount = for {
    (device, unitcount) <- TableQuery[TDDevice].joinLeft(unitCountPerDevice).on(_.id === _._1).map(k => {
      val u = k._2.getOrElse((0, 0))._2
      (k._1, u)
    })
  } yield (device, unitcount)

有人可以帮我找出我在这里失败的地方吗?

【问题讨论】:

    标签: mysql scala slick


    【解决方案1】:

    试试这个方法

    def unitCountPerDevice = TableQuery[TDUnit].groupBy(k => k.deviceID).map(k => (k._1, k._2.map(_.id).length))
    
    def devicesWithUnitCount = TableQuery[TDDevice].joinLeft(unitCountPerDevice).on(_.id === _._1).map(d =>(d._1,d._2.map(_._2)))
    

    【讨论】:

      猜你喜欢
      • 2019-09-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2013-09-07
      • 1970-01-01
      相关资源
      最近更新 更多