我希望通过下一个查询找到年龄最小的人
(d/q '[:find ?name (min ?age)
:in [[?name ?age]]]
[["John" 20]
["Bill" 25]
["Jack" 20]
["Steve" 28]
["Andrew" 30]])
但结果是
[["Andrew" 30] ["Bill" 25] ["Jack" 20] ["John" 20] ["Steve" 28]]
怎么做?
答案 0 :(得分:3)
不是将查询链接在一起,而是使用子查询(在查询中而不是在查询之外进行查询调用):
(d/q '[:find ?name ?mage
:in $
:where [(datomic.api/q '[:find (min ?age)
:where [_ :age ?age]]
$) [[?mage]]]
[?name :age ?mage]]
[["John" :age 20]
["Bill" :age 25]
["Jack" :age 20]
["Steve" :age 28]
["Andrew" :age 30]])
返回:
#{["John" 20] ["Jack" 20]}
答案 1 :(得分:2)
这将是一个纯粹的Datalog解决方案
(let [db [["John" 20]
["Bill" 25]
["Jack" 20]
["Steve" 28]
["Andrew" 30]]]
(d/q '[:find ?name ?min-age
:in $ ?min-age
:where [?name ?min-age]]
db
(ffirst (d/q '[:find (min ?age)
:in [[?name ?age]]]
db))))
SQL中的HAVING子句不是查询语言的一部分,但由于所有查询都在对等体中执行,因此嵌套查询不会产生任何开销。
答案 2 :(得分:-1)
在这种情况下,您不需要datomic,因为您已经在序列中拥有了所需的所有数据。请改用clojure sort 。
(first (sort-by second [...]))