2011-02-02 4 views
0

計算されたフィールドANSWER_SCOREを作成してクエリの結果を注文するクエリを作成します。また、他の2つのフィールドQUESTION_IDとANSWER_IDを選択したいと思います。MySQLの別個のエントリORDER_BYの後のすべてのリピートを無視する

個別の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; 

答えて

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でレイアウトされます。

関連する問題