【问题标题】:MySQL Distinct Entries disregarding all repeats after ORDER_BYMySQL Distinct Entries 忽略 ORDER_BY 之后的所有重复
【发布时间】:2011-02-02 18:13:36
【问题描述】:

我想创建一个查询,该查询会创建一个计算字段 ANSWER_SCORE,然后它会根据该字段对查询结果进行排序。我还想选择另外两个字段 QUESTION_ID 和 ANSWER_ID。

我只想选择不同的 QUESTION_ID。但是,我还想选择与该 QUESTION_ID 相关的其他一些信息(这对于所有返回该 QUESTION_ID 的查询都是通用的。我不确定如何执行此操作。

这是我的查询:

SELECT  QUESTION_ID,
        ANSWER_ID,
        sum(ANSWER_SCORE) AS ANSWER_SCORE_SUMMED
FROM(SELECT
        nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID,
        cr.COMMUNICATIONS_ID AS ANSWER_ID,
        case when  cr.CONSUMER_ID= nc.SENDER_CONSUMER_ID then 2*(1 - EXP(-0.5 * (cal.REAL_TIPS_AMOUNT / ATV.AVG_TIPS) + .15))*(24/(((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(cal.LAST_MOD_TIME)+3600)/3600)))*(IFNULL(ces.EXPERT_SCORE,2) * IFNULL(cirm.CONSUMER_RATING,2) + (12.5 * IFNULL((bit_count((conv(scr_tip.survey_string, 2, 10) & conv(scr_view.survey_string, 2, 10)) | ((0xFFFFFFFF>>(32-6))&~(conv(scr_tip.survey_string, 2, 10)|conv(scr_view.survey_string, 2, 10))))/6),.3)))
            else (1 - EXP(-0.5 * (cal.REAL_TIPS_AMOUNT / ATV.AVG_TIPS) + .15))*(24/(((UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(cal.LAST_MOD_TIME)+3600)/3600)))*(IFNULL(ces.EXPERT_SCORE,2) * IFNULL(cirm.CONSUMER_RATING,2) + (12.5 * IFNULL((bit_count((conv(scr_tip.survey_string, 2, 10) & conv(scr_view.survey_string, 2, 10)) | ((0xFFFFFFFF>>(32-6))&~(conv(scr_tip.survey_string, 2, 10)|conv(scr_view.survey_string, 2, 10))))/6),.3)))
        end as ANSWER_SCORE
  FROM (SELECT 232 AS CONSUMER_ID,
            ACTION_LOG_ID,
            COMMUNICATIONS_ID
     FROM consumer_action_log 
     WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc 
    ON cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN network_communications AS nc1
    ON nc.PARENT_COMMUNICATIONS_ID=nc1.COMMUNICATIONS_ID
JOIN (SELECT ACTION_LOG_ID,
             LAST_MOD_TIME,
             CONSUMER_ID,
             SENDER_CONSUMER_ID,
             sum(tips_amount) AS real_tips_amount
      FROM consumer_action_log
      WHERE COMM_TYPE_ID=4
      GROUP BY COMMUNICATIONS_ID, SENDER_CONSUMER_ID) AS cal 
ON cr.ACTION_LOG_ID=cal.ACTION_LOG_ID
JOIN communication_interest_mapping AS cim 
    ON nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
LEFT JOIN consumer_interest_rating_mapping AS cirm 
    ON cr.CONSUMER_ID=cirm.CONSUMER_ID
    AND cim.CONSUMER_INTEREST_EXPERT_ID=cirm.CONSUMER_INTEREST_ID
JOIN network_communications_message AS ncm
  ON nc.PARENT_COMMUNICATIONS_ID=ncm.COMMUNICATIONS_ID
LEFT JOIN consumer_expert_score AS ces 
    ON nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
    AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID
LEFT JOIN surveycustomerrelation AS scr_tip
     ON cal.SENDER_CONSUMER_ID=scr_tip.Cust_ID
LEFT JOIN surveycustomerrelation AS scr_view
    ON cr.CONSUMER_ID=scr_view.CUST_ID
STRAIGHT_JOIN
    (
        SELECT AVG(cal.TIPS_AMOUNT) AS AVG_TIPS,
                   cal.SENDER_CONSUMER_ID AS CONSUMER_ID
        FROM CONSUMER_ACTION_LOG AS cal
        WHERE COMM_TYPE_ID=4
        GROUP BY cal.SENDER_CONSUMER_ID
    ) AS ATV
    ON cal.SENDER_CONSUMER_ID=ATV.CONSUMER_ID
    ) AS ASM
GROUP BY ANSWER_ID
ORDER BY ANSWER_SCORE_SUMMED DESC
LIMIT 0,20; 

【问题讨论】:

    标签: sql mysql sql-order-by distinct


    【解决方案1】:

    如果您返回的每个 QUESTION_ID 和 ANSWER_ID 的其他字段确实相同,您只需将它们添加到您的选择列表中并将它们放在 GROUP BY 子句中。例如

    SELECT QUESTION_ID,
        ANSWER_ID,
        FOO,
        BAR,
        SUM(ANSWER_SCORE) AS ANSWER_SCORE_SUMMED
    FROM...
    <snip>
    ...GROUP BY QUESTION_ID, ANSWER_ID, FOO, BAR
    

    这有一个额外的好处,即检查您对每个返回的 QUESTION_ID 的其他数据是否相同的假设,因为不同的组合都将使用它们自己的 ANSWER_SCORE_SUMMED 为您布置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-25
      • 1970-01-01
      • 2012-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多