2017-09-19 17 views
1

表示された情報のフィルタとして機能するqueryを作成しようとしています。MySQL - 各グループから2行しか選択しない

具体的には、この同じposition値を持つ2行までのクエリを表示します。

これまでのところこのコードを書いていますが、各カテゴリの1つしか表示されていません。何が間違っているのか分かりません。

SELECT name, surname, position, value, points FROM 
    (SELECT name, surname, position, value, points, 
    @num := IF(@type = position, @num + 1, 1) AS row_number, 
    @type := position AS dummy 
    FROM players 
    WHERE (name LIKE '%$searchphrase%' OR surname LIKE '%$searchphrase%') 
    AND value >= '$minvalue' 
    AND value <= '$maxvalue' 
    GROUP BY position) AS x WHERE x.row_number <= 2 
ORDER BY 
    CASE WHEN $filter=0 THEN points END DESC, 
    CASE WHEN $filter=1 THEN points END ASC, 
    CASE WHEN $filter=2 THEN value END DESC, 
    CASE WHEN $filter=3 THEN value END ASC, 
    CASE WHEN $filter=4 THEN surname END DESC, 
    CASE WHEN $filter=5 THEN surname END ASC 

答えて

1

あなたは正しいアイデアがあります。ただし、MySQLは式の評価順序を保証しません。さらに、サブクエリにはgroup by positionがあります。

だから私は、あなたが望むかもしれないと思う:

SELECT . . . 
FROM (SELECT name, surname, position, value, points, 
      (@num := if(@type = position, @num + 1, 
         if(@type := position, 1, 1) 
         ) 
      ) AS row_number 
     FROM players p CROSS JOIN 
      (SELECT @num := 0, @type := '') params 
     WHERE (name LIKE '%$searchphrase%' OR surname LIKE '%$searchphrase%') AND 
      value >= '$minvalue' AND value <= '$maxvalue' 
     ORDER BY position 
    ) x 
WHERE x.row_number <= 2 
+0

、私は必要な正確に何のおかげで、あなたは非常に多くのゴードンだそれ! –

関連する問題