1. 程式人生 > >group_concat ——sql語句在group後,組內所有欄位的獲取

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>

這樣就可以統計資料啦,謝謝閱覽。