首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Clojure HoneySQL --如何在join之后将字符串值聚合成一行?

Clojure HoneySQL --如何在join之后将字符串值聚合成一行?
EN

Stack Overflow用户
提问于 2020-11-30 13:00:44
回答 2查看 97关注 0票数 2

我正在执行下面的查询,该查询连接3个表,以拉回锻炼和与它们关联的标签。

代码语言:javascript
运行
复制
(db/query {:select [:workouts.id :workouts.name :tag.tag_name]
             :from   [:workouts]
             :left-join [[:workout_tags :workout_tag] [:= :workout_tag.workout_id :workouts.id]
                         [:tags :tag] [:= :tag.tag_id :workout_tag.tag_id]]
             :where  [:= :workouts.id 1]}))

这将返回以下内容:

代码语言:javascript
运行
复制
({:id 1, :name "Short", :tag_name "cardio"} 
 {:id 1, :name "Short", :tag_name "No weights"})

理想情况下,我希望向最终用户返回一个结果,其中tag_name被组合到一个字段中。类似于:

代码语言:javascript
运行
复制
{:id 1, :name "Short", :tag_name ["cardio" "No weights"]} 

它将看到我可以在事后很容易地做到这一点,但我想看看是否有一个内置的MySQL函数可以完成我想要完成的任务。似乎GROUP_CONACT可以做我正在寻找的事情,但是我似乎不能让它在HoneySQL的上下文中工作。

EN

回答 2

Stack Overflow用户

发布于 2020-12-01 04:48:22

以下内容应接近您需要的内容:

代码语言:javascript
运行
复制
  (require '[honeysql.core :as hc])
  (hc/format {:select [:workouts.id :workouts.name [(hc/call :group_concat :tag.tag_name) :tag_name]]
              :from   [:workouts]
              :left-join [[:workout_tags :workout_tag] [:= :workout_tag.workout_id :workouts.id]
                          [:tags :tag] [:= :tag.tag_id :workout_tag.tag_id]]
              :where  [:= :workouts.id 1]
              :group-by [:tag.tag_name]})

这将生成以下SQL:

代码语言:javascript
运行
复制
SELECT workouts.id, workouts.name, group_concat(tag.tag_name) AS tag_name
FROM workouts
LEFT JOIN workout_tags workout_tag ON workout_tag.workout_id = workouts.id
LEFT JOIN tags tag ON tag.tag_id = workout_tag.tag_id
WHERE workouts.id = ?
GROUP BY tag.tag_name

您没有显示您尝试过的内容或失败的内容,这肯定有助于我们确定我们应该建议什么作为答案。

票数 2
EN

Stack Overflow用户

发布于 2020-11-30 13:59:39

我会在事后才这么做:

代码语言:javascript
运行
复制
  (let [data    [{:id 1, :name "Short", :tag_name "cardio"}
                 {:id 1, :name "Short", :tag_name "No weights"}
                 {:id 2, :name "Long", :tag_name "Tall"}
                 {:id 2, :name "Long", :tag_name "Hills"}]
        grouped (group-by :id data)
        id-tags (vec (for [[id data-maps] grouped]
                       (let [tags (mapv :tag_name data-maps)]
                         {:id id :tags tags})))]
    (is= id-tags
      [{:id 1, :tags ["cardio" "No weights"]}
       {:id 2, :tags ["Tall" "Hills"]}]))

中间结果grouped如下所示

代码语言:javascript
运行
复制
grouped => 
{1
 [{:id 1, :name "Short", :tag_name "cardio"}
  {:id 1, :name "Short", :tag_name "No weights"}],
 2
 [{:id 2, :name "Long", :tag_name "Tall"}
  {:id 2, :name "Long", :tag_name "Hills"}]}

有关完整配置的详细信息,请参阅my favorite template project

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65068321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档