LifeUserDynamicsMapper.xml 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <mapper namespace="shop.alien.mapper.LifeUserDynamicsMapper">
  4. <select id="getDynamicsList" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
  5. SELECT
  6. -- 1. 用 ANY_VALUE() 包裹非聚合列,符合 only_full_group_by 规则
  7. ANY_VALUE(dyna1.id) AS id,
  8. ANY_VALUE(dyna1.dynamicsType) AS dynamicsType,
  9. ANY_VALUE(dyna1.title) AS title,
  10. ANY_VALUE(dyna1.phoneId) AS phoneId,
  11. ANY_VALUE(dyna1.context) AS context,
  12. ANY_VALUE(dyna1.image_path) AS image_path,
  13. ANY_VALUE(dyna1.address) AS address,
  14. ANY_VALUE(dyna1.address_name) AS address_name,
  15. ANY_VALUE(dyna1.address_context) AS address_context,
  16. ANY_VALUE(dyna1.liulan_count) AS liulan_count,
  17. ANY_VALUE(dyna1.dianzan_count) AS dianzan_count,
  18. ANY_VALUE(dyna1.type) AS type,
  19. ANY_VALUE(dyna1.created_time) AS created_time,
  20. ANY_VALUE(dyna1.userType) AS userType,
  21. ANY_VALUE(dyna1.phone) AS phone,
  22. ANY_VALUE(dyna1.draft) AS draft,
  23. ANY_VALUE(dyna1.address_province) AS address_province,
  24. ANY_VALUE(dyna1.top_status) AS top_status,
  25. ANY_VALUE(dyna1.top_time) AS top_time,
  26. ANY_VALUE(dyna1.enable_status) AS enable_status,
  27. ANY_VALUE(dyna1.userName) AS userName,
  28. ANY_VALUE(dyna1.userImage) AS userImage,
  29. ANY_VALUE(dyna1.storeUserId) AS storeUserId,
  30. ANY_VALUE(dyna1.storeOrUserId) AS storeOrUserId,
  31. ANY_VALUE(dyna1.isExpert) AS isExpert,
  32. ANY_VALUE(dyna1.store_name) AS store_name,
  33. ANY_VALUE(dyna1.transfer_count) AS transferCount,
  34. -- 2. 修正聚合计数逻辑:用 COUNT(DISTINCT) 避免重复计数,粉丝数统计 lf1.id 而非 dyna1.id
  35. COUNT(DISTINCT lf1.id) AS fansCount,
  36. -- 保留内层的评论数、转发数(从 dyna1 中取聚合后的值)
  37. ANY_VALUE(dyna1.commentCount) AS commentCount,
  38. ANY_VALUE(dyna1.transferNum) AS transferNum
  39. FROM (
  40. SELECT
  41. -- 内层同样用 ANY_VALUE() 包裹非聚合列
  42. ANY_VALUE(dyna.id) AS id,
  43. ANY_VALUE(dyna.dynamicsType) AS dynamicsType,
  44. ANY_VALUE(dyna.title) AS title,
  45. ANY_VALUE(dyna.phoneId) AS phoneId,
  46. ANY_VALUE(dyna.context) AS context,
  47. ANY_VALUE(dyna.image_path) AS image_path,
  48. ANY_VALUE(dyna.address) AS address,
  49. ANY_VALUE(dyna.address_name) AS address_name,
  50. ANY_VALUE(dyna.address_context) AS address_context,
  51. ANY_VALUE(dyna.liulan_count) AS liulan_count,
  52. ANY_VALUE(dyna.dianzan_count) AS dianzan_count,
  53. ANY_VALUE(dyna.type) AS type,
  54. ANY_VALUE(dyna.created_time) AS created_time,
  55. ANY_VALUE(dyna.userType) AS userType,
  56. ANY_VALUE(dyna.phone) AS phone,
  57. ANY_VALUE(dyna.draft) AS draft,
  58. ANY_VALUE(dyna.address_province) AS address_province,
  59. ANY_VALUE(dyna.top_status) AS top_status,
  60. ANY_VALUE(dyna.top_time) AS top_time,
  61. ANY_VALUE(dyna.enable_status) AS enable_status,
  62. ANY_VALUE(dyna.transfer_count) AS transfer_count,
  63. ANY_VALUE(dyna.userName) AS userName,
  64. ANY_VALUE(dyna.userImage) AS userImage,
  65. ANY_VALUE(dyna.storeUserId) AS storeUserId,
  66. ANY_VALUE(dyna.storeOrUserId) AS storeOrUserId,
  67. ANY_VALUE(dyna.isExpert) AS isExpert,
  68. ANY_VALUE(dyna.store_name) AS store_name,
  69. -- 3. 修正评论数/转发数:COUNT(DISTINCT) 避免 LEFT JOIN 导致的重复计数
  70. COUNT(DISTINCT sc.id) AS commentCount,
  71. COUNT(DISTINCT lm.id) AS transferNum
  72. FROM (
  73. WITH dynamice AS (
  74. SELECT
  75. CASE
  76. WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
  77. WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
  78. ELSE 0
  79. END AS dynamicsType,
  80. id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
  81. CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  82. WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  83. WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  84. END AS phoneId,
  85. context, image_path, address,address_name,address_context,
  86. liulan_count, dianzan_count, type, created_time,
  87. CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
  88. CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  89. WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  90. WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  91. END phone,
  92. draft , address_province, top_status, top_time, enable_status, transfer_count
  93. FROM life_user_dynamics
  94. WHERE delete_flag = 0 AND draft = 0 AND phone_user_type IS NOT NULL AND phone_ref_id IS NOT NULL
  95. )
  96. SELECT
  97. dynamice.*,
  98. user.nick_name userName, user.head_img userImage,
  99. info.id storeUserId, user.id storeOrUserId,
  100. 0 isExpert, info.store_name
  101. FROM dynamice
  102. LEFT JOIN store_user user ON user.delete_flag = 0 AND dynamice.phoneUserType = 2 AND user.id = dynamice.phoneRefId
  103. LEFT JOIN store_info info ON info.id = user.store_id AND info.delete_flag = 0
  104. LEFT JOIN store_img img ON img.store_id = user.store_id AND img.img_type = '10' AND img.delete_flag = 0
  105. WHERE dynamice.phoneUserType = 2
  106. UNION
  107. SELECT
  108. dynamice.*,
  109. user.user_name userName, user.user_image userImage,
  110. user.id storeUserId, user.id storeOrUserId,
  111. IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert,
  112. '' store_name
  113. FROM dynamice
  114. JOIN life_user user ON user.delete_flag = 0 AND dynamice.phoneUserType = 1 AND user.id = dynamice.phoneRefId
  115. LEFT JOIN life_user_expert lue ON lue.user_id = user.id AND lue.delete_flag = 0
  116. WHERE dynamice.phoneUserType = 1
  117. ) dyna
  118. LEFT JOIN life_comment lc ON lc.dongtai_shequ_id = dyna.id
  119. LEFT JOIN store_comment sc ON sc.business_id = dyna.id AND sc.business_type = 2 AND sc.delete_flag = 0
  120. LEFT JOIN life_message lm ON lm.business_id = dyna.id
  121. -- 4. GROUP BY 仅保留主键 id(因 dyna.id 是唯一主键,ANY_VALUE() 包裹的列在同一 id 下值唯一)
  122. GROUP BY dyna.id
  123. ) dyna1
  124. LEFT JOIN life_fans lf1 ON lf1.followed_id = dyna1.phoneId AND lf1.delete_flag = 0
  125. WHERE 1=1
  126. <if test="nickName != null and nickName != ''">
  127. AND dyna1.userName LIKE CONCAT('%', #{nickName}, '%')
  128. </if>
  129. <if test="userType != null and userType != ''">
  130. AND dyna1.userType = #{userType}
  131. </if>
  132. <if test="dynamicsType != null and dynamicsType != ''">
  133. AND dyna1.dynamicsType = #{dynamicsType}
  134. </if>
  135. <if test="releaseStartTime != null and releaseStartTime != ''">
  136. AND dyna1.created_time >= #{releaseStartTime}
  137. </if>
  138. <if test="storeName != null and storeName != ''">
  139. AND dyna1.store_name LIKE CONCAT('%', #{storeName}, '%')
  140. </if>
  141. <if test="releaseEndTime != null and releaseEndTime != ''">
  142. AND dyna1.created_time &lt;= #{releaseEndTime}
  143. </if>
  144. -- 5. 外层 GROUP BY 仅保留主键 id,保证分组逻辑正确
  145. GROUP BY dyna1.id
  146. -- 6. 最终排序移到外层,子查询的 ORDER BY 无意义且影响性能
  147. ORDER BY dyna1.top_status DESC, dyna1.top_time DESC;
  148. </select>
  149. <select id="getDynamicsDetail" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
  150. select dyna1.*, COUNT(dyna1.id) AS fansCount from (
  151. select dyna.*,COUNT(sc.id) AS commentCount from (
  152. with dynamice as(
  153. select
  154. CASE
  155. WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
  156. WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
  157. ELSE 0
  158. END AS dynamicsType, id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
  159. CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  160. WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  161. WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  162. END AS phoneId,
  163. context, image_path, address,address_name,address_context, liulan_count, dianzan_count, type, created_time,
  164. CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
  165. CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  166. WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  167. WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  168. END phone,
  169. draft , address_province, top_status, top_time, enable_status,transfer_count AS transferCount
  170. from life_user_dynamics
  171. where id = #{id} and delete_flag = 0 and draft = 0 and phone_user_type is not null and phone_ref_id is not null order by created_time desc
  172. )
  173. select dynamice.*, user.nick_name userName, user.head_img userImage, info.id storeUserId, user.id storeOrUserId, 0 isExpert
  174. from dynamice
  175. left join store_user user on user.delete_flag = 0 and dynamice.phoneUserType = 2 and user.id = dynamice.phoneRefId
  176. left join store_info info on info.id = user.store_id and info.delete_flag = 0
  177. left join store_img img on img.store_id = user.store_id and img.img_type = '10' and img.delete_flag = 0
  178. where dynamice.phoneUserType = 2
  179. union
  180. select dynamice.*, user.user_name userName, user.user_image userImage, user.id storeUserId, user.id storeOrUserId, IF(lue.expert_code IS NOT NULL , 1, 0) AS isExpert
  181. from dynamice
  182. join life_user user on user.delete_flag = 0 and dynamice.phoneUserType = 1 and user.id = dynamice.phoneRefId
  183. left join life_user_expert lue on lue.user_id = user.id and lue.delete_flag = 0
  184. where dynamice.phoneUserType = 1) dyna
  185. left join life_comment lc on lc.dongtai_shequ_id = dyna.id
  186. left join store_comment sc on sc.business_id = dyna.id and sc.business_type = 2 and sc.delete_flag = 0
  187. left join life_message lm on lm.business_id = dyna.id
  188. GROUP BY dyna.id order by dyna.created_time desc) dyna1
  189. left join life_fans lf1 on lf1.followed_id = dyna1.phoneId and lf1.delete_flag = 0
  190. GROUP by dyna1.id order by dyna1.top_status desc, dyna1.top_time desc
  191. </select>
  192. <select id="getStoreDynamicslist" resultType="shop.alien.entity.store.vo.LifeUserDynamicsVo">
  193. select
  194. ANY_VALUE(dyna1.dynamicsType) AS dynamicsType,
  195. ANY_VALUE(dyna1.id) AS id,
  196. ANY_VALUE(dyna1.title) AS title,
  197. ANY_VALUE(dyna1.phoneId) AS phoneId,
  198. ANY_VALUE(dyna1.context) AS context,
  199. ANY_VALUE(dyna1.image_path) AS imagePath,
  200. ANY_VALUE(dyna1.address) AS address,
  201. ANY_VALUE(dyna1.address_name) AS addressName,
  202. ANY_VALUE(dyna1.address_context) AS addressContext,
  203. ANY_VALUE(dyna1.liulan_count) AS liulanCount,
  204. ANY_VALUE(dyna1.dianzan_count) AS dianzanCount,
  205. ANY_VALUE(dyna1.type) AS type,
  206. ANY_VALUE(dyna1.created_time) AS createdTime,
  207. ANY_VALUE(dyna1.userType) AS userType,
  208. ANY_VALUE(dyna1.phone) AS phone,
  209. ANY_VALUE(dyna1.draft) AS draft,
  210. ANY_VALUE(dyna1.address_province) AS addressProvince,
  211. ANY_VALUE(dyna1.top_status) AS topStatus,
  212. ANY_VALUE(dyna1.top_time) AS topTime,
  213. ANY_VALUE(dyna1.enable_status) AS enableStatus,
  214. ANY_VALUE(dyna1.business_id) AS businessId,
  215. ANY_VALUE(dyna1.userName) AS userName,
  216. ANY_VALUE(dyna1.userImage) AS userImage,
  217. ANY_VALUE(dyna1.storeUserId) AS storeUserId,
  218. ANY_VALUE(dyna1.storeName) AS storeName,
  219. ANY_VALUE(dyna1.storeOrUserId) AS storeOrUserId,
  220. ANY_VALUE(dyna1.isExpert) AS isExpert,
  221. ANY_VALUE(dyna1.isLike) AS isLike,
  222. ANY_VALUE(dyna1.commentCount) AS commentCount,
  223. ANY_VALUE(dyna1.transferNum) AS transferCount,
  224. COUNT(dyna1.id) AS fansCount
  225. from
  226. (
  227. select
  228. ANY_VALUE(dyna.dynamicsType) AS dynamicsType,
  229. dyna.id,
  230. ANY_VALUE(dyna.title) AS title,
  231. ANY_VALUE(dyna.phoneId) AS phoneId,
  232. ANY_VALUE(dyna.context) AS context,
  233. ANY_VALUE(dyna.image_path) AS image_path,
  234. ANY_VALUE(dyna.address) AS address,
  235. ANY_VALUE(dyna.address_name) AS address_name,
  236. ANY_VALUE(dyna.address_context) AS address_context,
  237. ANY_VALUE(dyna.liulan_count) AS liulan_count,
  238. ANY_VALUE(dyna.dianzan_count) AS dianzan_count,
  239. ANY_VALUE(dyna.type) AS type,
  240. ANY_VALUE(dyna.created_time) AS created_time,
  241. ANY_VALUE(dyna.userType) AS userType,
  242. ANY_VALUE(dyna.phone) AS phone,
  243. ANY_VALUE(dyna.draft) AS draft,
  244. ANY_VALUE(dyna.address_province) AS address_province,
  245. ANY_VALUE(dyna.top_status) AS top_status,
  246. ANY_VALUE(dyna.top_time) AS top_time,
  247. ANY_VALUE(dyna.enable_status) AS enable_status,
  248. ANY_VALUE(dyna.business_id) AS business_id,
  249. ANY_VALUE(dyna.userName) AS userName,
  250. ANY_VALUE(dyna.userImage) AS userImage,
  251. ANY_VALUE(dyna.storeUserId) AS storeUserId,
  252. ANY_VALUE(dyna.storeName) AS storeName,
  253. ANY_VALUE(dyna.storeOrUserId) AS storeOrUserId,
  254. ANY_VALUE(dyna.isExpert) AS isExpert,
  255. ANY_VALUE(dyna.isLike) AS isLike,
  256. COUNT(sc.id) AS commentCount,
  257. COUNT(lm.id) AS transferNum
  258. from
  259. (
  260. with dynamice as(
  261. select
  262. CASE
  263. WHEN image_path REGEXP '.mp4|.avi|.flv|.mkv|.rmvb|.wmv|.3gp|.mov' THEN 2
  264. WHEN image_path REGEXP '.jpg|.jpeg|.png|.bmp|.webp|.gif|.svg' THEN 1
  265. ELSE 0
  266. END AS dynamicsType, id, title, phone_user_type phoneUserType, phone_ref_id phoneRefId,
  267. CASE WHEN phone_user_type = 1 THEN CONCAT('user_', (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  268. WHEN phone_user_type = 2 THEN CONCAT('store_', (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  269. WHEN phone_user_type = 3 THEN CONCAT('lawyer_', (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1))
  270. END AS phoneId,
  271. context, image_path, address, address_name, address_context, liulan_count, dianzan_count, type, created_time,
  272. CASE WHEN phone_user_type = 1 THEN 'user' WHEN phone_user_type = 2 THEN 'store' WHEN phone_user_type = 3 THEN 'lawyer' END userType,
  273. CASE WHEN phone_user_type = 1 THEN (SELECT user_phone FROM life_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  274. WHEN phone_user_type = 2 THEN (SELECT phone FROM store_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  275. WHEN phone_user_type = 3 THEN (SELECT phone FROM lawyer_user WHERE id = phone_ref_id AND delete_flag = 0 LIMIT 1)
  276. END phone,
  277. draft , address_province, top_status, top_time, enable_status,
  278. business_id
  279. from life_user_dynamics
  280. where phone_user_type = #{phoneUserType} and phone_ref_id = #{phoneRefId} and delete_flag = 0 and draft = 0 order by created_time desc
  281. )
  282. select
  283. dynamice.*,
  284. user.nick_name userName,
  285. user.head_img userImage,
  286. info.id storeUserId,
  287. info.store_name storeName,
  288. user.id storeOrUserId,
  289. 0 isExpert,
  290. IF(llr.huifu_id IS NOT NULL or llr1.huifu_id IS NOT NULL, 1, 0) AS isLike
  291. from
  292. dynamice
  293. left join store_user user on
  294. user.delete_flag = 0 and dynamice.phoneUserType = 2 and user.id = dynamice.phoneRefId
  295. left join store_info info on
  296. info.id = user.store_id
  297. and info.delete_flag = 0
  298. left join store_img img on
  299. img.store_id = user.store_id
  300. and img.img_type = '10'
  301. and img.delete_flag = 0
  302. left join life_like_record llr on
  303. llr.huifu_id = dynamice.id
  304. and llr.delete_flag = 0
  305. and llr.dianzan_user_type = 1 and llr.dianzan_ref_id = #{userId})
  306. left join life_like_record llr1 on
  307. llr1.huifu_id = dynamice.id
  308. and llr1.delete_flag = 0
  309. and llr1.dianzan_user_type = 2 and llr1.dianzan_ref_id = #{userId})
  310. where
  311. dynamice.phoneUserType = 2) dyna
  312. left join life_comment lc on
  313. lc.dongtai_shequ_id = dyna.id
  314. left join store_comment sc on
  315. sc.business_id = dyna.id
  316. and sc.business_type = 2
  317. and sc.delete_flag = 0
  318. left join life_message lm on
  319. lm.business_id = dyna.id
  320. GROUP BY
  321. dyna.id
  322. order by
  323. dyna.created_time desc) dyna1
  324. left join life_fans lf1 on
  325. lf1.followed_id = dyna1.phoneId and lf1.delete_flag = 0
  326. GROUP by
  327. dyna1.id
  328. order by
  329. dyna1.top_status desc,
  330. dyna1.top_time desc
  331. </select>
  332. </mapper>