- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有人知道如何在 Scala 查询中归档多对多吗?
我想将一篇博文连接到一系列标签。
这是我的数据库设计:
我的自定义代码已经成功,但是在检查 Scala 查询生成的 SQL 时,我对我的解决方案不满意。
我尝试了一种函数式方法,它生成了许多 SQL 查询,导致大量往返。
我可以弄清楚如何将查询数量减少大约一半。
一个手工制作的查询,可以在一个查询中获取我所有格式良好的数据,
select
p.id, p.content, p.posted_date, GROUP_CONCAT(t.name)
from
post p,
tag t,
tag_post tp
where
tp.post_id = p.id and tp.tag_id = t.id
group by
p.id
从 Scala Query 生成的查询提供相同的数据。
SELECT `t1`.`id`,`t1`.`content`,`t1`.`posted_date` FROM `post` `t1`
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=3)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=4)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=5)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=6)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=7)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=8)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=9)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=10)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=11)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=12)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=13)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=14)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=15)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=16)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=17)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=2)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=18)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=19)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=1)
SELECT `t1`.`id`,`t1`.`name` FROM `tag` `t1` WHERE (`t1`.`id`=3)
SELECT `t1`.`tag_id` FROM `tag_post` `t1` WHERE (`t1`.`post_id`=20)
我担心所有这些往返行程可能会产生太多开销。
有没有人成功地实现了一个很好的 Scala 查询多对多实现?
最佳答案
编辑
您可以像这样模拟 group_concat:
val groupConcat = SimpleFunction[String]("GROUP_CONCAT")
如果您在查询范围内创建此方法,它应该像这样简单:
yield (alias.a, alias.b, groupConcat(alias.c))
由于我将这些辅助函数存储在抽象数据库包装器中并在特定的 DBMS(如 MySQL)中实现,因此它变得有点复杂,因为 SimpleFunction 类型签名需要此抽象方法定义:
val groupConcat: ( Seq[Column[_]] => OperatorColumn[String] )
这意味着实现需要传入一个 Seq(alias.c),这有点违反直觉,我们只是传入一个列。无论如何,很高兴它能工作,GROUP_CONCAT 在 MySQL 中非常方便
原创
没有发布您的代码,上帝知道出了什么问题,但试试这个:
val q = (for {
tp <- TagPost
p <- Post if tp.post_id is p.id
t <- Tag if tp.tag_id is t.id
_ <- Query groupBy p.id
} yield (p.id, p.content, p.posted_date, group_concat(t.name)))
println(q.selectStatement)
您将需要创建一个函数来复制 MySQL 的 GROUP_CONCAT。参见 SimpleFunction source ;此对象的一元方法允许您将命名列传递给基础 DBMS 函数。
val group_concat =
SimpleFunction.unary[NamedColumn[String], String]("GROUP_CONCAT")
关于sql - ScalaQuery 多对多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465263/
我所说的修改是指 SQL UPDATE 和 DELETE 的对应物。 在这两种情况下,我都有一个对象记录,我想在数据库中删除它。该表始终具有主键,并且在我的对象记录中设置。 请注意,我没有“创建”该对
我试过,例如: object WebCache extends Table[(...)]("myschema.mytable") { ... } 但这不起作用。 最佳答案 现在光滑 has thi
我问过 similar question recently, and got a great reply关于使用 Lift Mapper 解决多对多关系问题。我看了ScalaQuery/SLICK d
在 ScalaQuery 中,我可以这样做来处理“原始”结果行: for ( x (r.<<[String], r.<<[Int])) ) ) { println(x) } 但这完全是位
这是我想要执行的 scalaquery 查询, ... def generateFares(scheduleId:NamedColumn[Int], toCityId:NamedColumn[Int]
我们如何在 ScalaQuery 中定义多主键和外键? object myTable1 extends Table([Int])("myTable1") { def id = column[Int
有人知道如何在 Scala 查询中归档多对多吗? 我想将一篇博文连接到一系列标签。 这是我的数据库设计: 我的自定义代码已经成功,但是在检查 Scala 查询生成的 SQL 时,我对我的解决方案不满意
我想用 or 加入一个任意长度的过滤器列表.如果列表是固定长度的,它将如下所示: query.filter(filters(0) || filters(1) || … || filter(n)) 使用
我有一个返回 Person 的查询我用来从数据库中获取一页结果的对象: def page(pageNumber:Int, pageSize:Int) : Seq[Person] = database.
我在将不同的查询组件组合成单个查询时遇到了一些麻烦。我的目标是创建一组特征(例如 SoftDeletable、HasName、SortedByName、WithTimestamps),我可以简单地将其
我已经在 Scala 和 ScalaQuery 中开始了我的第一个项目。到目前为止,尽管我偶尔会遇到一些困难,但两者看起来都不错并且很有前途。 有人可以向我解释如何获取类对象(在本例中是具有大约 12
尝试删除一批记录时,仅删除奇数行! val byUser = Orders.createFinderBy(_.userID) byUser(id).mutate(_.delete) 如果我打印记录,我
ScalaQuery 要求(据我所知)在您的代码中使用特定于提供者的导入,例如: import org.scalaquery.ql.extended.H2Driver.Implicit._ 我们正在尝
我需要通过我的一种 api 方法对我的数据库进行小(但频繁)的操作。当我每次尝试将它们包装到“withSession”中时,我的表现都很糟糕。 db withSession { SomeTable
有人知道使用 Play 框架和 SLICK (ScalaQuery) 的好教程或示例项目 (github) 吗?我正在努力让他们一起工作。 我收到此错误: [info] play - Applicat
我正在使用 ScalaQuery 访问 PostgreSql。 Data 是一个表,它有一个名为 id 的自动增量主键,定义为 def id = column[Long] ("id", O NotNu
在他的comparison of ScalaQuery and Squeryl , Stefan Zeiger(ScalaQuery 的作者)在第三个要点中说: ScalaQuery comes wi
说我有这样的表: UserActions UserId INT ActionDate TIMESTAMP Description TEXT 保存用户执行某些操作的日期。如果我想
我已经有了一些带有一个迁移脚本的简单项目: # --- !Ups create table user ( name varchar(255) not null primary key
我想尝试在 Play 中使用 ScalaQuery!框架(版本 2.0.2),但我无法让它工作。我在 Build.scala 文件中添加了以下行: val appDependencies = Se
我是一名优秀的程序员,十分优秀!