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)
4

4 に答える 4

1

MySql では、GROUP BY ですべての非集計を指定せずに、誤って値を集計できます。そのため、user_group_id に表示する値を独自に選択します。必要な結果を得るには、ユーザーごとに最大の display_style_priority を取得し、user_id と値を元のテーブルに結合してフィルター処理する必要があります。joinという 2 つの形式を使用できます。

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)

サブクエリの最大値と比較します。

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にあります。

于 2012-05-05T17:20:17.157 に答える
0

あなたは付け加えられますorder by

ORDER BY xf_user_group_relation.user_id DESC
于 2012-05-05T16:10:57.953 に答える
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)


他の RDBMS (PostgreSQL、MSSQL、Oracle など) には、この種のタスクを大幅に簡素化するためのウィンドウ関数があります。

PostgreSQL では、クエリは次のように機能します。

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);

PostgreSQL マニュアルのウィンドウ関数の紹介。

于 2012-05-05T17:25:56.703 に答える
0

このクエリは、ID が最も低いグループをペアにして、display_style_priorty が最も高いと言っていますか?

その場合、サブクエリがそれを処理できますが、取得している結果が何であり、望ましい結果が何であるかはわかりません

于 2012-05-05T16:51:00.810 に答える