group_concat ——sql語句在group後,組內所有欄位的獲取
經常寫sql的都知道,group處理的sql,一般是為了獲取一些統計引數,或者分組的欄位等等,如果分組後,想要獲取某個組內的所有欄位,這時就需要使用
此函式返回字串結果,其中NULL
包含來自組的連線非值。NULL
如果沒有非NULL
值,則返回 。完整語法如下:
GROUP_CONCAT([DISTINCT] expr [,expr ...] [ORDER BY {unsigned_integer | col_name | expr} [ASC | DESC] [,col_name ...]] [SEPARATOR str_val])
mysql> SELECT student_name, GROUP_CONCAT(test_score) FROM student GROUP BY student_name;
要麼:
mysql> SELECT student_name, GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') FROM student GROUP BY student_name;
在MySQL中,您可以獲得表示式組合的連線值。要消除重複值,請使用該 DISTINCT
子句。要對結果中的值進行排序,請使用該ORDER BY
子句。要按相反順序排序,請將DESC
(descending)關鍵字新增到要在ORDER BY
子句中排序的列的名稱中。預設為升序; 這可以使用ASC
關鍵字明確指定。組中值之間的預設分隔符是逗號(,
SEPARATOR
後跟應在組值之間插入的字串文字值。要完全消除分隔符,請指定 SEPARATOR ''
。
<span style="color:#555555"><span style="color:black"><code class="language-sql"><span style="color:#0077aa">SET</span> <span style="color:#999999">[</span><span style="color:#0077aa">GLOBAL</span> <span style="color:#a67f59">|</span> <span style="color:#0077aa">SESSION</span><span style="color:#999999">]</span> group_concat_max_len <span style="color:#a67f59">=</span> <em>val</em><span style="color:#999999">;</span></code></span></span>
返回值是非二進位制或二進位制字串,具體取決於引數是非二進位制還是二進位制字串。結果型別是TEXT
或者 BLOB
除非 group_concat_max_len
小於或等於512,在這種情況下結果型別是 VARCHAR
或 VARBINARY
。
專案應用:
專案中有一個需求,就是根據操作者獲取管理帳號的數量,然後獲取帳號下匯入資料的數量。
第一步:根據操作者進行分組,獲取所管理的帳號數量
第二步:根據帳號資訊統計該這些帳號下所有匯入資料量
第三步:彙總,完成
操作者 | 帳號數量 | 匯入資料量 | 查詢時間段 |
張山 | 3 | 28 | 2018-09-28 - 2018-09-29 |
李思 | 5 | 16 | 2018-09-28 - 2018-09-29 |
具體實現:
如果分組查詢獲取帳號數量,那麼肯定要進行二次查詢,獲取當前操作者管理的所有帳號,再根據帳號獲取匯入資料量,這樣需要連線兩次資料庫,操作也比較麻煩。
使用group_concat(account_id)就會一次查詢出所有需要的資訊,無需再次獲取。
<resultMap id="AccountResultMap" type="com.jd.account.entity.OperatorWorkStaDO" >
<result column="operator" property="operator" jdbcType="VARCHAR" />
<result column="num" property="num" jdbcType="BIGINT" />
<result column="ids" property="ids" jdbcType="VARCHAR" />
</resultMap>
<select id="getAccountIdByOperator" resultMap="AccountResultMap" >
select
operator,count(*) num ,GROUP_CONCAT(Aaccount_id) ids
from account_info
where create_time BETWEEN #{startTime} AND #{endTime}
<if test="operator != null">
and operator = #{operator}
</if>
GROUP BY operator ORDER by operator
</select>
這樣獲取到的ids就是一個字串拼接的引數,例如"10021","10022","10028"
然後根據獲取到的ids再統計匯入資料量即可:
<select id="getDataNum" resultType="java.lang.Integer">
select
count(*)
from data_sta
where (create_time BETWEEN #{startTime} AND #{endTime}) and
<!--方案一,直接使用字串-->
account_id in
(${ids})
<!--方案二,將字串轉為對應物件型別的集合
<foreach collection="ids" item="item" index="index" separator="," open="("
close=")">
#{item}
</foreach>-->
</select>
這樣就可以統計資料啦,謝謝閱覽。