guyue
10 天以前 a9e958ce3675c4950ceddd3fd6f939cdf0d2bc5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.linghu.mapper.KeywordMapper">
 
    <resultMap id="BaseResultMap" type="com.linghu.model.entity.Keyword">
            <id property="keyword_id" column="keyword_id" jdbcType="INTEGER"/>
            <result property="order_id" column="order_id" jdbcType="VARCHAR"/>
            <result property="keyword_name" column="keyword_name" jdbcType="VARCHAR"/>
            <result property="num" column="num" jdbcType="INTEGER"/>
            <result property="task_id" column="task_id" jdbcType="VARCHAR"/>
            <result property="status" column="status" jdbcType="VARCHAR"/>
    </resultMap>
 
    <sql id="Base_Column_List">
        keyword_id,order_id,keyword_name,
        num,task_id,status
    </sql>
    <select id="statics" resultType="com.linghu.model.vo.KeywordStaticsVO">
        SELECT
        p.platform_id,
        p.platform_name,
        SUM( r.repetition_num ) AS total_repetitions,
        ROUND(
        SUM( r.repetition_num ) * 100.0 / (
        SELECT
        SUM( r2.repetition_num )
        FROM
        reference r2
        WHERE
        r2.keyword_id = #{keywordId}
        <if test = "questionId != null" >
            AND r2.question_id = #{questionId}
        </if>
        AND r2.num = #{num}
        ),2) AS repetition_ratio
        FROM
        reference r
        JOIN platform p ON r.platform_id = p.platform_id
        WHERE
        r.keyword_id = #{keywordId}
        <if test = "questionId != null" >
            AND r.question_id = #{questionId}
        </if>
        AND r.num = #{num}
 
        GROUP BY
        p.platform_id,
        p.platform_name
        ORDER BY
        total_repetitions DESC
    </select>
    <select id="getResultByTypeId" resultType="com.linghu.model.vo.PlatformProportionVO">
        SELECT
            t.type_name,
            p.platform_name,
            SUM(r.repetition_num) AS total_repetitions,
            -- 全平台分布占比 = 当前平台重复次数 / 所有平台重复次数
            ROUND(SUM(r.repetition_num) * 100.0 / (
                SELECT SUM(r2.repetition_num)
                FROM reference r2
                WHERE r2.keyword_id = #{keywordId}
                <if test="questionId != null">
                    AND r2.question_id = #{questionId}
                </if>
                AND r2.num = #{num}
            ), 2) AS all_platform_ratio,
            -- 同类平台分布占比 = 当前平台重复次数 / 同类型平台重复次数
            ROUND(SUM(r.repetition_num) * 100.0 / (
                SELECT SUM(r3.repetition_num)
                FROM reference r3
                JOIN platform p3 ON r3.platform_id = p3.platform_id
                WHERE r3.keyword_id = #{keywordId}
                <if test="questionId != null">
                    AND r3.question_id = #{questionId}
                </if>
                AND r3.num = #{num}
                AND p3.type_id = p.type_id
            ), 2) AS same_type_ratio
        FROM
        reference r
        JOIN
        platform p ON r.platform_id = p.platform_id
        JOIN
        type t ON p.type_id = t.type_id
        WHERE
            r.keyword_id = #{keywordId}
            <if test="questionId != null">
                AND r.question_id = #{questionId}
            </if>
            AND r.num = #{num}
            <if test="typeId != null">
                AND p.type_id = #{typeId}
            </if>
        GROUP BY t.type_name,p.platform_name
        ORDER BY
        total_repetitions  DESC
    </select>
    <select id="getResultByPlatformId" resultType="com.linghu.model.vo.ResultListVO">
        SELECT
            r.reference_id,
            p.platform_name,
            r.title,
            r.repetition_num,
            r.create_time,
            r.url
        FROM
        reference r
        JOIN
        platform p ON r.platform_id = p.platform_id
        WHERE
            r.keyword_id = #{keywordId}
            <if test="questionId != null">
                AND r.question_id = #{questionId}
            </if>
            AND r.num = #{num}
            <if test="platformId != null">
                AND r.platform_id = #{platformId}
            </if>
 
        ORDER BY
        r.repetition_num DESC
    </select>
    <select id="getTypeIds" resultType="java.lang.Integer">
        SELECT DISTINCT t.type_id  -- 使用 DISTINCT 去重,确保每个 type_id 只出现一次
        FROM reference r
        JOIN platform p ON r.platform_id = p.platform_id
        JOIN type t ON p.type_id = t.type_id
        WHERE r.keyword_id = #{keywordId}
        <if test="questionId != null">
            AND r.question_id = #{questionId}
        </if>
        <if test="isNow != null">
            <!-- 当 isNow=1 时使用 keyword.num,否则使用 1 -->
            AND r.num =
            <choose>
                <when test="isNow == 1">
                    #{keyword.num}
                </when>
                <otherwise>
                    1
                </otherwise>
            </choose>
        </if>
 
 
        ORDER BY t.type_id  -- 按 type_id 排序,结果更规范
    </select>
</mapper>