RecommendMapper.xml 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735
  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="com.zhentao.mapper.RecommendMapper">
  4. <resultMap id="RecommendUserMap" type="com.zhentao.vo.RecommendUserVO">
  5. <result column="user_id" property="userId"/>
  6. <result column="nickname" property="nickname"/>
  7. <result column="gender" property="gender"/>
  8. <result column="birth_date" property="birthDate"/>
  9. <result column="birthDate" property="birthDate"/>
  10. <result column="province_id" property="provinceId"/>
  11. <result column="city_id" property="cityId"/>
  12. <result column="area_id" property="areaId"/>
  13. <result column="province_name" property="provinceName"/>
  14. <result column="city_name" property="cityName"/>
  15. <result column="area_name" property="areaName"/>
  16. <result column="height" property="height"/>
  17. <result column="weight" property="weight"/>
  18. <result column="education_level" property="educationLevel"/>
  19. <result column="salary_range" property="salaryRange"/>
  20. <result column="hobby" property="hobby"/>
  21. <result column="star" property="star"/>
  22. <result column="animal" property="animal"/>
  23. <result column="school_name" property="schoolName"/>
  24. <result column="job_title" property="jobTitle"/>
  25. <result column="avatar_url" property="avatarUrl"/>
  26. <result column="compatibility_score" property="compatibilityScore"/>
  27. <result column="last_active_at" property="lastActiveAt"/>
  28. </resultMap>
  29. <select id="selectRecommendedUsers" resultMap="RecommendUserMap">
  30. <![CDATA[
  31. SELECT
  32. u.user_id,
  33. u.nickname,
  34. u.gender,
  35. p.province_id,
  36. p.city_id,
  37. p.area_id,
  38. p.height,
  39. p.weight,
  40. p.education_level,
  41. p.salary_range,
  42. p.hobby,
  43. p.star,
  44. p.animal,
  45. p.school_name,
  46. p.job_title,
  47. u.avatar_url,
  48. (
  49. ROUND(
  50. (
  51. 1.0 * (COALESCE(p.authenticity_score, 0) / 100.0)
  52. + 0.9 * (
  53. CASE WHEN #{oppoOnly} = 1 AND u.gender <> cur.cu_gender THEN 1
  54. WHEN #{oppoOnly} = 0 THEN 1
  55. ELSE 0 END
  56. )
  57. + 0.8 * (
  58. CASE
  59. WHEN ABS(TIMESTAMPDIFF(YEAR, u.birth_date, cur.cu_birth)) <= 3 THEN 1
  60. WHEN ABS(TIMESTAMPDIFF(YEAR, u.birth_date, cur.cu_birth)) <= 5 THEN 0.5
  61. ELSE 0
  62. END
  63. )
  64. + 0.7 * LEAST(
  65. (
  66. CASE
  67. WHEN p.salary_range >= cur.cu_salary THEN 1
  68. WHEN p.salary_range = cur.cu_salary - 1 THEN 0.5
  69. ELSE 0
  70. END
  71. ),
  72. (
  73. CASE
  74. WHEN cur.cu_salary >= p.salary_range THEN 1
  75. WHEN cur.cu_salary = p.salary_range - 1 THEN 0.5
  76. ELSE 0
  77. END
  78. )
  79. )
  80. + 0.6 * LEAST(
  81. (
  82. CASE
  83. WHEN p.education_level >= cur.cu_edu THEN 1
  84. WHEN p.education_level = cur.cu_edu - 1 THEN 0.5
  85. ELSE 0
  86. END
  87. ),
  88. (
  89. CASE
  90. WHEN cur.cu_edu >= p.education_level THEN 1
  91. WHEN cur.cu_edu = p.education_level - 1 THEN 0.5
  92. ELSE 0
  93. END
  94. )
  95. )
  96. + 0.5 * (
  97. CASE
  98. WHEN p.height IS NOT NULL AND cur.cu_height IS NOT NULL THEN
  99. CASE
  100. WHEN ABS(p.height - cur.cu_height) <= 5 THEN 1
  101. WHEN ABS(p.height - cur.cu_height) <= 10 THEN 0.5
  102. ELSE 0
  103. END
  104. ELSE 0
  105. END
  106. )
  107. + 0.4 * (
  108. CASE WHEN JSON_OVERLAPS(p.hobby, cur.cu_hobby) THEN 1 ELSE 0 END
  109. )
  110. + 0.3 * (
  111. CASE WHEN p.city_id = cur.cu_city THEN 1
  112. WHEN p.province_id = cur.cu_province THEN 0.5 ELSE 0 END
  113. )
  114. + 0.2 * (
  115. CASE
  116. WHEN p.star IS NOT NULL AND cur.cu_star IS NOT NULL THEN
  117. CASE
  118. WHEN p.star = cur.cu_star THEN 1
  119. WHEN (
  120. (CASE
  121. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  122. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  123. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  124. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  125. ELSE 0
  126. END)
  127. =
  128. (CASE
  129. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  130. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  131. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  132. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  133. ELSE 0
  134. END)
  135. ) THEN 0.75
  136. WHEN (
  137. (
  138. (CASE
  139. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  140. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  141. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  142. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  143. ELSE 0
  144. END) = 1
  145. AND
  146. (CASE
  147. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  148. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  149. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  150. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  151. ELSE 0
  152. END) = 3
  153. ) OR (
  154. (CASE
  155. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  156. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  157. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  158. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  159. ELSE 0
  160. END) = 3
  161. AND
  162. (CASE
  163. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  164. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  165. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  166. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  167. ELSE 0
  168. END) = 1
  169. ) OR (
  170. (CASE
  171. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  172. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  173. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  174. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  175. ELSE 0
  176. END) = 2
  177. AND
  178. (CASE
  179. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  180. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  181. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  182. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  183. ELSE 0
  184. END) = 4
  185. ) OR (
  186. (CASE
  187. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  188. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  189. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  190. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  191. ELSE 0
  192. END) = 4
  193. AND
  194. (CASE
  195. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  196. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  197. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  198. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  199. ELSE 0
  200. END) = 2
  201. )
  202. ) THEN 0.5
  203. ELSE 0
  204. END
  205. ELSE 0
  206. END
  207. )
  208. + 0.1 * (
  209. CASE
  210. WHEN p.animal IS NOT NULL AND cur.cu_animal IS NOT NULL THEN
  211. CASE
  212. WHEN p.animal = cur.cu_animal THEN 1
  213. WHEN (
  214. (CASE
  215. WHEN p.animal IN ('猴','鼠','龙') THEN 1
  216. WHEN p.animal IN ('猪','兔','羊') THEN 2
  217. WHEN p.animal IN ('虎','马','狗') THEN 3
  218. WHEN p.animal IN ('蛇','鸡','牛') THEN 4
  219. ELSE 0
  220. END)
  221. =
  222. (CASE
  223. WHEN cur.cu_animal IN ('猴','鼠','龙') THEN 1
  224. WHEN cur.cu_animal IN ('猪','兔','羊') THEN 2
  225. WHEN cur.cu_animal IN ('虎','马','狗') THEN 3
  226. WHEN cur.cu_animal IN ('蛇','鸡','牛') THEN 4
  227. ELSE 0
  228. END)
  229. ) THEN 0.75
  230. WHEN (
  231. (p.animal = '鼠' AND cur.cu_animal = '牛') OR (p.animal = '牛' AND cur.cu_animal = '鼠') OR
  232. (p.animal = '虎' AND cur.cu_animal = '猪') OR (p.animal = '猪' AND cur.cu_animal = '虎') OR
  233. (p.animal = '兔' AND cur.cu_animal = '狗') OR (p.animal = '狗' AND cur.cu_animal = '兔') OR
  234. (p.animal = '龙' AND cur.cu_animal = '鸡') OR (p.animal = '鸡' AND cur.cu_animal = '龙') OR
  235. (p.animal = '蛇' AND cur.cu_animal = '猴') OR (p.animal = '猴' AND cur.cu_animal = '蛇') OR
  236. (p.animal = '马' AND cur.cu_animal = '羊') OR (p.animal = '羊' AND cur.cu_animal = '马')
  237. ) THEN 0.75
  238. ELSE 0
  239. END
  240. ELSE 0
  241. END
  242. )
  243. + 0.05 * (
  244. CASE WHEN p.school_name IS NOT NULL AND cur.cu_school IS NOT NULL AND p.school_name = cur.cu_school THEN 1 ELSE 0 END
  245. )
  246. + 0.05 * (
  247. CASE
  248. WHEN p.job_title IS NOT NULL AND cur.cu_job_title IS NOT NULL THEN
  249. CASE
  250. WHEN p.job_title = cur.cu_job_title THEN 1
  251. WHEN p.job_title LIKE CONCAT('%', cur.cu_job_title, '%') OR cur.cu_job_title LIKE CONCAT('%', p.job_title, '%') THEN 0.5
  252. ELSE 0
  253. END
  254. ELSE 0
  255. END
  256. )
  257. + 0.05 * (
  258. CASE
  259. WHEN p.weight IS NOT NULL AND cur.cu_weight IS NOT NULL THEN
  260. CASE
  261. WHEN ABS(p.weight - cur.cu_weight) <= 5 THEN 1
  262. WHEN ABS(p.weight - cur.cu_weight) <= 10 THEN 0.5
  263. ELSE 0
  264. END
  265. ELSE 0
  266. END
  267. )
  268. + 0.05 * (
  269. CASE
  270. WHEN u.last_active_at >= NOW() - INTERVAL 7 DAY THEN 1
  271. WHEN u.last_active_at >= NOW() - INTERVAL 30 DAY THEN 0.4
  272. ELSE 0
  273. END
  274. )
  275. ) / 5.7 * 100
  276. , 2)
  277. ) AS compatibility_score,
  278. u.last_active_at
  279. FROM users u
  280. LEFT JOIN user_profile p ON p.user_id = u.user_id
  281. CROSS JOIN (
  282. SELECT
  283. u.user_id AS cu_id,
  284. u.gender AS cu_gender,
  285. u.birth_date AS cu_birth,
  286. COALESCE(up.city_id, NULL) AS cu_city,
  287. COALESCE(up.province_id, NULL) AS cu_province,
  288. COALESCE(up.height, NULL) AS cu_height,
  289. COALESCE(up.weight, NULL) AS cu_weight,
  290. COALESCE(up.education_level, NULL) AS cu_edu,
  291. COALESCE(up.salary_range, NULL) AS cu_salary,
  292. COALESCE(up.hobby, NULL) AS cu_hobby,
  293. COALESCE(up.star, NULL) AS cu_star,
  294. COALESCE(up.animal, NULL) AS cu_animal,
  295. COALESCE(up.school_name, NULL) AS cu_school,
  296. COALESCE(up.job_title, NULL) AS cu_job_title
  297. FROM users u
  298. LEFT JOIN user_profile up ON up.user_id = u.user_id
  299. WHERE u.user_id = #{userId}
  300. AND u.gender IS NOT NULL
  301. AND u.gender <> 0
  302. ) cur
  303. WHERE cur.cu_id IS NOT NULL
  304. AND cur.cu_gender IS NOT NULL
  305. AND cur.cu_gender <> 0
  306. AND u.user_id <> cur.cu_id
  307. AND u.status = 1
  308. AND u.gender IS NOT NULL
  309. AND u.gender <> 0
  310. AND (
  311. #{oppoOnly} = 0
  312. OR u.gender <> cur.cu_gender
  313. )
  314. ORDER BY compatibility_score DESC, u.last_active_at DESC
  315. LIMIT #{limit}
  316. ]]>
  317. </select>
  318. <select id="selectByRules" resultMap="RecommendUserMap">
  319. SELECT
  320. u.user_id,
  321. u.nickname,
  322. u.gender,
  323. u.avatar_url,
  324. p.province_id,
  325. p.city_id,
  326. p.area_id,
  327. p.height,
  328. p.education_level,
  329. p.salary_range,
  330. p.star,
  331. p.animal,
  332. p.hobby,
  333. (
  334. ROUND(
  335. (
  336. 1.0 * (COALESCE(p.authenticity_score, 0) / 100.0)
  337. + 0.9 * (
  338. CASE WHEN u.gender &lt;&gt; cur.cu_gender THEN 1 ELSE 0.2 END
  339. ) /* 不同性别权重更高,相同性别给予较低分 */
  340. + 0.8 * (
  341. CASE
  342. WHEN ABS(TIMESTAMPDIFF(YEAR, u.birth_date, cur.cu_birth)) &lt;= 3 THEN 1
  343. WHEN ABS(TIMESTAMPDIFF(YEAR, u.birth_date, cur.cu_birth)) &lt;= 5 THEN 0.5
  344. ELSE 0
  345. END
  346. )
  347. + 0.7 * LEAST(
  348. (
  349. CASE
  350. WHEN p.salary_range &gt;= cur.cu_salary THEN 1
  351. WHEN p.salary_range = cur.cu_salary - 1 THEN 0.5
  352. ELSE 0
  353. END
  354. ),
  355. (
  356. CASE
  357. WHEN cur.cu_salary &gt;= p.salary_range THEN 1
  358. WHEN cur.cu_salary = p.salary_range - 1 THEN 0.5
  359. ELSE 0
  360. END
  361. )
  362. )
  363. + 0.6 * LEAST(
  364. (
  365. CASE
  366. WHEN p.education_level &gt;= cur.cu_edu THEN 1
  367. WHEN p.education_level = cur.cu_edu - 1 THEN 0.5
  368. ELSE 0
  369. END
  370. ),
  371. (
  372. CASE
  373. WHEN cur.cu_edu &gt;= p.education_level THEN 1
  374. WHEN cur.cu_edu = p.education_level - 1 THEN 0.5
  375. ELSE 0
  376. END
  377. )
  378. )
  379. + 0.5 * (
  380. CASE
  381. WHEN p.height IS NOT NULL AND cur.cu_height IS NOT NULL THEN
  382. CASE
  383. WHEN ABS(p.height - cur.cu_height) &lt;= 5 THEN 1
  384. WHEN ABS(p.height - cur.cu_height) &lt;= 10 THEN 0.5
  385. ELSE 0
  386. END
  387. ELSE 0
  388. END
  389. )
  390. + 0.4 * (
  391. CASE WHEN JSON_OVERLAPS(p.hobby, cur.cu_hobby) THEN 1 ELSE 0 END
  392. )
  393. + 0.3 * (
  394. CASE WHEN p.city_id = cur.cu_city THEN 1
  395. WHEN p.province_id = cur.cu_province THEN 0.5 ELSE 0 END
  396. )
  397. + 0.2 * (
  398. CASE
  399. WHEN p.star IS NOT NULL AND cur.cu_star IS NOT NULL THEN
  400. CASE
  401. WHEN p.star = cur.cu_star THEN 1
  402. WHEN (
  403. (CASE
  404. WHEN p.star IN ('白羊座','狮子座','射手座') THEN 1
  405. WHEN p.star IN ('金牛座','处女座','摩羯座') THEN 2
  406. WHEN p.star IN ('双子座','天秤座','水瓶座') THEN 3
  407. WHEN p.star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  408. ELSE 0
  409. END)
  410. =
  411. (CASE
  412. WHEN cur.cu_star IN ('白羊座','狮子座','射手座') THEN 1
  413. WHEN cur.cu_star IN ('金牛座','处女座','摩羯座') THEN 2
  414. WHEN cur.cu_star IN ('双子座','天秤座','水瓶座') THEN 3
  415. WHEN cur.cu_star IN ('巨蟹座','天蝎座','双鱼座') THEN 4
  416. ELSE 0
  417. END)
  418. ) THEN 0.75
  419. ELSE 0
  420. END
  421. ELSE 0
  422. END
  423. )
  424. + 0.1 * (
  425. CASE
  426. WHEN p.animal IS NOT NULL AND cur.cu_animal IS NOT NULL THEN
  427. CASE WHEN p.animal = cur.cu_animal THEN 1 ELSE 0 END
  428. ELSE 0
  429. END
  430. )
  431. + 0.05 * (
  432. CASE WHEN p.school_name IS NOT NULL AND cur.cu_school IS NOT NULL AND p.school_name = cur.cu_school THEN 1 ELSE 0 END
  433. )
  434. + 0.05 * (
  435. CASE
  436. WHEN p.job_title IS NOT NULL AND cur.cu_job_title IS NOT NULL THEN
  437. CASE
  438. WHEN p.job_title = cur.cu_job_title THEN 1
  439. WHEN p.job_title LIKE CONCAT('%', cur.cu_job_title, '%') OR cur.cu_job_title LIKE CONCAT('%', p.job_title, '%') THEN 0.5
  440. ELSE 0
  441. END
  442. ELSE 0
  443. END
  444. )
  445. + 0.05 * (
  446. CASE
  447. WHEN p.weight IS NOT NULL AND cur.cu_weight IS NOT NULL THEN
  448. CASE
  449. WHEN ABS(p.weight - cur.cu_weight) &lt;= 5 THEN 1
  450. WHEN ABS(p.weight - cur.cu_weight) &lt;= 10 THEN 0.5
  451. ELSE 0
  452. END
  453. ELSE 0
  454. END
  455. )
  456. + 0.05 * (
  457. CASE
  458. WHEN u.last_active_at &gt;= NOW() - INTERVAL 7 DAY THEN 1
  459. WHEN u.last_active_at &gt;= NOW() - INTERVAL 30 DAY THEN 0.4
  460. ELSE 0
  461. END
  462. )
  463. ) / 5.7 * 100
  464. , 2)
  465. ) AS compatibility_score
  466. FROM users u
  467. JOIN user_profile p ON p.user_id = u.user_id
  468. CROSS JOIN (
  469. SELECT
  470. u.user_id AS cu_id,
  471. u.gender AS cu_gender,
  472. u.birth_date AS cu_birth,
  473. up.city_id AS cu_city,
  474. up.province_id AS cu_province,
  475. up.height AS cu_height,
  476. up.weight AS cu_weight,
  477. up.education_level AS cu_edu,
  478. up.salary_range AS cu_salary,
  479. up.hobby AS cu_hobby,
  480. up.star AS cu_star,
  481. up.animal AS cu_animal,
  482. up.school_name AS cu_school,
  483. up.job_title AS cu_job_title
  484. FROM users u
  485. LEFT JOIN user_profile up ON up.user_id = u.user_id
  486. WHERE u.user_id = #{q.userId}
  487. ) cur
  488. <where>
  489. u.status = 1
  490. AND u.gender IS NOT NULL
  491. AND u.gender &lt;&gt; 0
  492. <if test="q.userId != null">AND u.user_id &lt;&gt; #{q.userId}</if>
  493. AND (
  494. (#{q.gender} IS NOT NULL AND u.gender = #{q.gender})
  495. OR (#{q.gender} IS NULL AND (cur.cu_gender IS NOT NULL AND cur.cu_gender &lt;&gt; 0 AND u.gender &lt;&gt; cur.cu_gender))
  496. )
  497. <if test="q.provinceId != null">AND p.province_id = #{q.provinceId}</if>
  498. <if test="q.cityId != null">AND p.city_id = #{q.cityId}</if>
  499. <if test="q.areaId != null">AND p.area_id = #{q.areaId}</if>
  500. <if test="q.heightMin != null">AND p.height &gt;= #{q.heightMin}</if>
  501. <if test="q.heightMax != null">AND p.height &lt;= #{q.heightMax}</if>
  502. <if test="q.educationMin != null">AND p.education_level &gt;= #{q.educationMin}</if>
  503. <if test="q.salaryMin != null">AND p.salary_range &gt;= #{q.salaryMin}</if>
  504. <if test="q.star != null">AND p.star = #{q.star}</if>
  505. <if test="q.animal != null">AND p.animal = #{q.animal}</if>
  506. <if test="hobbyJson != null">AND JSON_OVERLAPS(p.hobby, #{hobbyJson})</if>
  507. <if test="birthMin != null">AND u.birth_date &gt;= #{birthMin}</if>
  508. <if test="birthMax != null">AND u.birth_date &lt;= #{birthMax}</if>
  509. <if test="excludeIds != null and excludeIds.size() &gt; 0">
  510. AND u.user_id NOT IN
  511. <foreach collection="excludeIds" item="id" open="(" separator="," close=")">#{id}</foreach>
  512. </if>
  513. </where>
  514. ORDER BY compatibility_score DESC, u.last_active_at DESC
  515. LIMIT #{limit} OFFSET #{offset}
  516. </select>
  517. <resultMap id="ProvinceResultMap" type="com.zhentao.pojo.Province">
  518. <id property="id" column="id" jdbcType="INTEGER"/>
  519. <result property="name" column="name" jdbcType="VARCHAR"/>
  520. </resultMap>
  521. <resultMap id="CityResultMap" type="com.zhentao.pojo.City">
  522. <id property="id" column="id" jdbcType="INTEGER"/>
  523. <result property="name" column="name" jdbcType="VARCHAR"/>
  524. <result property="provinceId" column="province_id" jdbcType="INTEGER"/>
  525. </resultMap>
  526. <resultMap id="AreaResultMap" type="com.zhentao.pojo.Area">
  527. <id property="id" column="id" jdbcType="INTEGER"/>
  528. <result property="name" column="name" jdbcType="VARCHAR"/>
  529. <result property="cityId" column="city_id" jdbcType="INTEGER"/>
  530. </resultMap>
  531. <select id="selectAllProvinces" resultMap="ProvinceResultMap">
  532. SELECT id, name FROM province ORDER BY id
  533. </select>
  534. <select id="selectAllCities" resultMap="CityResultMap">
  535. SELECT id, name, province_id FROM city ORDER BY id
  536. </select>
  537. <select id="selectCitiesByProvince" resultMap="CityResultMap">
  538. SELECT id, name, province_id FROM city WHERE province_id = #{provinceId} ORDER BY id
  539. </select>
  540. <select id="selectAreasByCity" resultMap="AreaResultMap">
  541. SELECT id, name, city_id FROM area WHERE city_id = #{cityId} ORDER BY id
  542. </select>
  543. <!-- 插入用户喜欢记录 -->
  544. <insert id="insertUserLike">
  545. <![CDATA[
  546. INSERT INTO user_likes_user (user_id, like_user_id, create_time)
  547. VALUES (#{userId}, #{likeUserId}, NOW())
  548. ON DUPLICATE KEY UPDATE create_time = NOW()
  549. ]]>
  550. </insert>
  551. <!-- 删除用户喜欢记录 -->
  552. <delete id="deleteUserLike">
  553. <![CDATA[
  554. DELETE FROM user_likes_user
  555. WHERE user_id = #{userId} AND like_user_id = #{likeUserId}
  556. ]]>
  557. </delete>
  558. <!-- 查询用户喜欢的列表 -->
  559. <select id="selectLikedUsers" resultMap="RecommendUserMap">
  560. <![CDATA[
  561. SELECT DISTINCT
  562. ulu.create_time,
  563. u.user_id,
  564. u.nickname,
  565. u.gender,
  566. u.birth_date,
  567. p.province_id,
  568. p.city_id,
  569. p.area_id,
  570. p.height,
  571. p.weight,
  572. p.education_level,
  573. p.salary_range,
  574. p.hobby,
  575. p.star,
  576. p.animal,
  577. p.school_name,
  578. p.job_title,
  579. u.avatar_url,
  580. u.last_active_at,
  581. 80.0 AS compatibility_score
  582. FROM user_likes_user ulu
  583. JOIN users u ON u.user_id = ulu.like_user_id
  584. LEFT JOIN user_profile p ON p.user_id = u.user_id
  585. WHERE ulu.user_id = #{userId}
  586. AND u.status = 1
  587. ORDER BY ulu.create_time DESC
  588. LIMIT #{offset}, #{limit}
  589. ]]>
  590. </select>
  591. <!-- 查询用户喜欢的用户数量 -->
  592. <select id="countLikedUsers" resultType="java.lang.Integer">
  593. <![CDATA[
  594. SELECT COUNT(*)
  595. FROM user_likes_user ulu
  596. JOIN users u ON u.user_id = ulu.like_user_id
  597. WHERE ulu.user_id = #{userId}
  598. AND u.status = 1
  599. ]]>
  600. </select>
  601. <!-- 查询喜欢当前用户的用户列表 -->
  602. <select id="selectUsersWhoLikedMe" resultMap="RecommendUserMap">
  603. <![CDATA[
  604. SELECT DISTINCT
  605. ulu.create_time,
  606. u.user_id,
  607. u.nickname,
  608. u.gender,
  609. u.birth_date,
  610. DATE_FORMAT(u.birth_date, '%Y-%m-%d') AS birthDate,
  611. p.province_id,
  612. p.city_id,
  613. p.area_id,
  614. pr.name AS province_name,
  615. ct.name AS city_name,
  616. ar.name AS area_name,
  617. p.height,
  618. p.weight,
  619. p.education_level,
  620. p.salary_range,
  621. p.hobby,
  622. p.star,
  623. p.animal,
  624. p.school_name,
  625. p.job_title,
  626. u.avatar_url,
  627. u.last_active_at,
  628. 80.0 AS compatibility_score
  629. FROM user_likes_user ulu
  630. JOIN users u ON u.user_id = ulu.user_id
  631. LEFT JOIN user_profile p ON p.user_id = u.user_id
  632. LEFT JOIN province pr ON pr.id = p.province_id
  633. LEFT JOIN city ct ON ct.id = p.city_id
  634. LEFT JOIN area ar ON ar.id = p.area_id
  635. WHERE ulu.like_user_id = #{userId}
  636. AND u.status = 1
  637. ORDER BY ulu.create_time DESC
  638. LIMIT #{offset}, #{limit}
  639. ]]>
  640. </select>
  641. <!-- 统计喜欢当前用户的用户数量 -->
  642. <select id="countUsersWhoLikedMe" resultType="java.lang.Integer">
  643. <![CDATA[
  644. SELECT COUNT(*)
  645. FROM user_likes_user ulu
  646. JOIN users u ON u.user_id = ulu.user_id
  647. WHERE ulu.like_user_id = #{userId}
  648. AND u.status = 1
  649. ]]>
  650. </select>
  651. <!-- 插入用户浏览记录 -->
  652. <insert id="insertUserLook">
  653. <![CDATA[
  654. INSERT INTO user_look (user_id, look_user_id, create_time, update_time)
  655. VALUES (#{userId}, #{lookUserId}, NOW(), NOW())
  656. ON DUPLICATE KEY UPDATE update_time = NOW()
  657. ]]>
  658. </insert>
  659. <!-- 查询用户浏览的列表 -->
  660. <select id="selectLookedUsers" resultMap="RecommendUserMap">
  661. <![CDATA[
  662. SELECT
  663. ul.create_time,
  664. u.user_id,
  665. u.nickname,
  666. u.gender,
  667. u.birth_date,
  668. DATE_FORMAT(u.birth_date, '%Y-%m-%d') AS birthDate,
  669. p.province_id,
  670. p.city_id,
  671. p.area_id,
  672. pr.name AS province_name,
  673. ct.name AS city_name,
  674. ar.name AS area_name,
  675. p.height,
  676. p.weight,
  677. p.education_level,
  678. p.salary_range,
  679. p.hobby,
  680. p.star,
  681. p.animal,
  682. p.school_name,
  683. p.job_title,
  684. u.avatar_url,
  685. u.last_active_at,
  686. 80.0 AS compatibility_score
  687. FROM (
  688. SELECT DISTINCT look_user_id, MAX(create_time) AS create_time
  689. FROM user_look
  690. WHERE user_id = #{userId}
  691. GROUP BY look_user_id
  692. ) ul
  693. JOIN users u ON u.user_id = ul.look_user_id
  694. LEFT JOIN user_profile p ON p.user_id = u.user_id
  695. LEFT JOIN province pr ON pr.id = p.province_id
  696. LEFT JOIN city ct ON ct.id = p.city_id
  697. LEFT JOIN area ar ON ar.id = p.area_id
  698. WHERE u.status = 1
  699. ORDER BY ul.create_time DESC
  700. LIMIT #{offset}, #{limit}
  701. ]]>
  702. </select>
  703. <!-- 统计用户浏览的用户数量 -->
  704. <select id="countLookedUsers" resultType="java.lang.Integer">
  705. <![CDATA[
  706. SELECT COUNT(DISTINCT ul.look_user_id)
  707. FROM user_look ul
  708. JOIN users u ON u.user_id = ul.look_user_id
  709. WHERE ul.user_id = #{userId}
  710. AND u.status = 1
  711. ]]>
  712. </select>
  713. </mapper>