mysql - Clojure HoneySQL - 如何将连接后的字符串值聚合到单行中?

标签 mysql clojure honeysql

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

(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]}))

这将返回以下内容:

({:id 1, :name "Short", :tag_name "cardio"} 
 {:id 1, :name "Short", :tag_name "No weights"})

理想情况下,我希望向最终用户返回单个结果,并将 tag_name 合并到单个字段中。像这样的东西:

{:id 1, :name "Short", :tag_name ["cardio" "No weights"]} 

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

最佳答案

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

  (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:

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

您没有展示您尝试过的内容或失败的内容,这绝对有助于我们确定我们应该建议的答案。

关于mysql - Clojure HoneySQL - 如何将连接后的字符串值聚合到单行中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65068321/

相关文章:

mysql - 如何使用 GenericContainer 配置 spring 数据源,该 GenericContainer 从自定义 MySQL Docker 镜像创建容器

java - 自动生成 key

clojure - 在 Clojure 中,我可以调用一个需要带有 map 的键的函数吗?

clojure - 如何让 HoneySQL 将订单作为复合键处理?

c# - mysql查询需要5分钟以上

mysql - 如何在Mysql中按天计数

string - 如何在clojure中检查字符串是否为大写?

macros - 将 Clojure 宏用于 DSL

mysql - 有没有办法在honysql select组件中使用SQL算术运算符?