在一对多中,"where exists"如何用slick表示?
In one-to-many, how to express "where exists" in slick?
让我们假设有两个表:
- 猫,
Cat
- 人格特质,
Personality_Trait
Cat
有一个 id
并且 Personality_Trait
有一个 id
和一个字符串 trait
.
例如
== Cat ==
id | name
---------------
0 | Tom
1 | Garfield
2 | Kitty
== Personality_Trait ===
id | trait
---------------
0 | stubborn
1 | stubborn
1 | sleepy
1 | moody
2 | sleepy
2 | moody
我如何获得至少具有我感兴趣的所有特征的所有猫?
例如当我在寻找 stubborn
和 moody
时,如何获得 Garfield
我在想类似的东西
Personality_Trait.groupBy(_.id).filter {
case (id, traits) => <predicate on traits>
}.map(_._1)
我认为首先你应该将 Personality_Trait 从 (id, trait) 翻译成 tempRecord (id,seq[trait]) 然后做谓词。
我找到了一个解决方案,虽然不优雅且可能效率低下:
val desiredTraits = Set("stubborn", "moody")
(for {
catId <- Personality_Trait.filter(_.trait inSetBind desiredTraits)
.groupBy(_.id).map { case (txnId, foundTraits) =>
(txnId, foundTraits.length)
}.filter { case (txnId, foundTraitCount) =>
foundTraitCount >= desiredTraits.size
}.map(_._1)
cat <- Cat if cat.id === catId
} yield (cat)).result
让我们假设有两个表:
- 猫,
Cat
- 人格特质,
Personality_Trait
Cat
有一个 id
并且 Personality_Trait
有一个 id
和一个字符串 trait
.
例如
== Cat ==
id | name
---------------
0 | Tom
1 | Garfield
2 | Kitty
== Personality_Trait ===
id | trait
---------------
0 | stubborn
1 | stubborn
1 | sleepy
1 | moody
2 | sleepy
2 | moody
我如何获得至少具有我感兴趣的所有特征的所有猫?
例如当我在寻找 stubborn
和 moody
Garfield
我在想类似的东西
Personality_Trait.groupBy(_.id).filter {
case (id, traits) => <predicate on traits>
}.map(_._1)
我认为首先你应该将 Personality_Trait 从 (id, trait) 翻译成 tempRecord (id,seq[trait]) 然后做谓词。
我找到了一个解决方案,虽然不优雅且可能效率低下:
val desiredTraits = Set("stubborn", "moody")
(for {
catId <- Personality_Trait.filter(_.trait inSetBind desiredTraits)
.groupBy(_.id).map { case (txnId, foundTraits) =>
(txnId, foundTraits.length)
}.filter { case (txnId, foundTraitCount) =>
foundTraitCount >= desiredTraits.size
}.map(_._1)
cat <- Cat if cat.id === catId
} yield (cat)).result