我正在执行以下查询,该查询连接 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/