Как выполнить сортировку с полем и количеством (*) в объединенной таблице в Slick 2?

#mysql #scala #slick #slick-2.0

#mysql #scala #slick #slick-2.0

Вопрос:

Я пытаюсь отсортировать свой запрос по одному полю и количеству объединенного запроса. Это мой SQL:

 SELECT * FROM stmt s 
LEFT JOIN rctn r ON s.id = r.stmt_id 
GROUP BY s.id 
ORDER BY (s.time   INTERVAL 1*COUNT(r.stmt_id) DAY) DESC
 

У меня уже есть

 stmts.where(_.orgid === orgId)
    .innerJoin(rctns).on(_.id === _.stmtId)
    .groupBy(_._1.id)
 

, но я понятия не имею, как выполнить сортировку.

Есть идеи?

Ответ №1:

Очень похоже на коллекции Scala:

 stmts.filter(_.orgid === orgId)
  .innerJoin(rctns).on(_.id === _.stmtId)
  .groupBy(_._1.id)
  .sortBy{ case (s_id,group) =>
    group.map(_._1.time).max   interval(
      group.map(_._2.stmtId).length,
      "DAY"
    )
  }
 

Это .max хак, потому что мы в настоящее время не поддерживаем .head , что вам пришлось бы использовать в коллекциях Scala. Имейте в виду, что interval это не входит в Slick, и вам придется определить это самостоятельно, используя SimpleExpression конструкцию, см. http://slick.typesafe.com/doc/2.0.2/userdefined.html#scala-database-functions .

Обратите внимание, что в прошлом у нас было больше ошибок с group by в Slick, чем с другими операциями. SQL использует множество хитростей с типами (идентификаторы, изменяющие тип между коллекциями, и скалярные значения и т. Д.), Которые Сложно получить при правильном сопоставлении с семантикой Scala. То, о чем мы знаем, теперь исправлено. Если вы столкнулись со случаем, когда генерируется недопустимый SQL, пожалуйста, сообщите об ошибке, которая позволяет нам воспроизвести проблему.

Комментарии:

1. Спасибо за ответы. Еще один вопрос по этому поводу: я написал интервальную функцию val interval = SimpleFunction.binary[Column[Int], String, Timestamp]("INTERVAL") , и теперь я получаю ошибку could not find implicit value for parameter tm: scala.slick.ast.BaseTypedType[java.sql.Timestamp] with scala.slick.ast.NumericTypedType group.map(_._1.time).max interval( . Я искал ошибку, но документы для slick очень редки. что я здесь делаю не так?

2. вы импортировали .simple._ из своего драйвера в том месте, где это происходит?

3. ДА. import scala.slick.driver.MySQLDriver.simple._

4. Пожалуйста, сообщите об ошибке, включая пример кода, который позволяет нам воспроизвести проблему. например, проект github