#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