2012-05-05 7 views
1

最高の表示優先度を持つグループを選択しようとしています。 問題は、IDが最も低いグループを選択し、表示優先度が最も高いグループを選択する方法がわかりません。最高の表示優先度を持つ複数のユーザーグループを選択してください

SQLクエリは次のようになります。

SELECT xf_user_group_relation.user_id , 
     xf_user_field_value.field_value, 
     xf_user_group_relation.user_group_id, 
     MAX(xf_user_group.display_style_priority) AS display_style_priority 
FROM xf_user_group_relation 
    INNER JOIN xf_user_group ON xf_user_group_relation.user_group_id = xf_user_group.user_group_id 
    INNER JOIN xf_user_field_value ON xf_user_group_relation.user_id = xf_user_field_value.user_id 
WHERE xf_user_group.display_style_priority >= 500 
     AND field_id = 'minecraft' 
     AND xf_user_group_relation.user_group_id NOT IN(21,22) 
GROUP BY xf_user_group_relation.user_id, 
     xf_user_field_value.field_value; 

グループが構成されたxf_user_groupにあります

user_group_id   int(10)  AUTO_INCREMENT 
title     varchar(50) 
display_style_priority int(10) 
user_css     text 
user_title    varchar(100) 
+0

?全体的に「表示優先度が最も高いグループ」をお探しですか?またはユーザーごと? –

+0

それはユーザーごとであり、field_idはxf_user_field_valueから来ます – BlackVoid

答えて

1

MySQLはerrorneously ALL非凝集体をspecifingなくて集計値をすることができます何が何であるかわからないんだけど、もしそうならGROUP BYでそこで、user_group_idに表示する値を自分で選択します。 必要な結果を得るには、ユーザーごとに最大のdisplay_style_priorityを取得し、user_idとvalueを元のテーブルに戻してフィルタリングしなければなりません。

SELECT * 
FROM xf_user_group_relation 
    INNER JOIN xf_user_group 
     ON xf_user_group_relation.user_group_id = xf_user_group.user_group_id 
    INNER JOIN xf_user_field_value 
     ON xf_user_group_relation.user_id = xf_user_field_value.user_id 
    INNER JOIN 
    (
     SELECT r2.user_id, MAX(g2.display_style_priority) display_style_priority 
     FROM xf_user_group_relation r2 
     INNER JOIN xf_user_group g2 
      ON r2.user_group_id = g2.user_group_id 
     GROUP BY r2.user_id 
    ) maxDSP 
     ON xf_user_group_relation.user_id = maxDSP.user_id 
     AND xf_user_group.display_style_priority = maxDSP.display_style_priority 
WHERE xf_user_group.display_style_priority >= 500 
     AND field_id = 'minecraft' 
     AND xf_user_group_relation.user_group_id NOT IN(21,22) 

そしてがsubqeryで最大と比較:

SELECT * 
FROM xf_user_group_relation 
    INNER JOIN xf_user_group 
     ON xf_user_group_relation.user_group_id = xf_user_group.user_group_id 
    INNER JOIN xf_user_field_value 
     ON xf_user_group_relation.user_id = xf_user_field_value.user_id 
WHERE xf_user_group.display_style_priority = 
     (SELECT MAX(g2.display_style_priority) 
     FROM xf_user_group_relation r2 
     INNER JOIN xf_user_group g2 
      ON r2.user_group_id = g2.user_group_id 
     WHERE r2.user_id = xf_user_group_relation.user_id 
    ) 
     AND xf_user_group.display_style_priority >= 500 
     AND field_id = 'minecraft' 
     AND xf_user_group_relation.user_group_id NOT IN(21,22) 

ライブデモがSql Fiddleであるあなたが使用する可能性のある二つの形式、参加があります。

0

あなたはorder by

ORDER BY xf_user_group_relation.user_id DESC 
0

を追加することができ、このクエリでは、ペアリングされていますIDが最も低く、最も高いdisplay_style_priortyを持っていると言っていますか?

サブクエリはあなたのためにそれの世話をすることができますが、私はあなたが取得している結果であり、所望の結果は

0

正確には、(user_id, field_value)ではなく、表示優先度が最も高いグループを返します。ユーザーあたりのグループ数はではありません。私はそれはあなたが望むものであると仮定します。

SELECT r.user_id, 
     x.field_value, 
     r.user_group_id, 
     x.max_disp AS display_style_priority 
FROM (
    SELECT r.user_id, v.field_value, max(g.display_style_priority) AS max_disp 
    FROM xf_user_group_relation r 
    JOIN xf_user_field_value v USING (user_id) 
    JOIN xf_user_group   g USING (user_group_id) 
    WHERE g.display_style_priority >= 500 
    AND v.field_id = 'minecraft' 
    AND r.user_group_id NOT IN (21,22) 
    GROUP BY r.user_id, v.field_value 
    ) x 
JOIN xf_user_group_relation r USING (user_id) 
JOIN xf_user_group g ON g.display_style_priority = x.max_disp 
        AND g.user_group_id = r.user_group_id 

ユーザーが同じdisplay_style_priorityを持つ複数のグループを持つことができる場合は、これは同じ最大表示の優先順位を共有する(user_id, field_value)ごとに複数の行を返すことができます。


(PostgreSQLの、MSSQLまたはOracleのような)他のRDBMSは根本タスクのこの種を簡素化するためにウィンドウ関数を持っています。 PostgreSQLの

、クエリは次のように仕事ができる:列は `から来field_id`ん

SELECT DISTINCT 
     r.user_id 
     ,v.field_value 
     ,last_value(g.user_group_id) OVER w AS user_group_id 
     ,last_value(g.display_style_priority) OVER w AS display_style_priority 
FROM xf_user_group_relation r 
JOIN xf_user_field_value v USING (user_id) 
JOIN xf_user_group   g USING (user_group_id) 
WHERE g.display_style_priority >= 500 
AND v.field_id = 'minecraft' 
AND r.user_group_id NOT IN (21,22) 
WINDOW w AS (PARTITION BY r.user_id, v.field_value 
      ORDER BY g.display_style_priority); 

Introduction to window functions in the PostgreSQL manual.

関連する問題