2016-06-30 5 views
0

私はテーブルを持っています:オーダープロダクトです。 MySQL 5.6でランクを生成する方法は?SQL。参加した販売ランク

商品の価値が同じランクの場合も同じでなければなりません。 私は数によってランク付けする必要が下

SELECT 
    count(productpk), productpk, 
    @prev := @curr, 
    @curr := count(productpk), 
    @rank := IF(@prev = @curr, @rank, @rank+1) AS rank 
FROM orders AS om 
JOIN products AS p ON om.PK=p.p_order, 
    (SELECT @curr := null, @prev := null, @rank := 0) sel1 
GROUP BY productpk ORDER BY count(productpk); 

enter image description here

有効な結果がある(カウント - >ランク):

  • 2 - > 3
  • 2 - > 3
  • 4 - > 2
  • 4 - > 2
  • 6 - > 1

答えて

1

このクエリはこのトリックを行う必要があります。

SELECT 
sq.productpk, 
sq.cp, 
@rank := IF(@prev = sq.cp, @rank, @rank + 1) AS rank, 
@prev := sq.cp 
FROM 
(
    SELECT 
    productpk, 
    COUNT(productpk) AS cp 
    FROM orders o 
    JOIN products p ON o.PK = p.p_order 
    GROUP BY productpk 
) sq 
, (SELECT @prev := NULL, @rank := 0) var_init_subquery 
ORDER BY sq.cp DESC 

SELECT句の順序は重要です。あなたは、この最初の

@prev := @curr, 

してから、この

@rank := IF(@prev = @curr,... 

のようなもののような何かを行うと@prevは常に@currに等しくなるので、それは、無意味です。 @currは、この場合はあまりにも無意味です。

@prevと、IF()機能の現在の行を比較する必要があります。その後、現在の行を@prevに割り当てます。次の行が読み取られると、@prevには前の行の値が保持されます。

最後に、グループクエリをサブクエリに配置する必要があります。一つは、クエリは論理的に SELECT WHERE

  • GROUP
  • BY
  • ORDERを持つことによって
  • FROM

    1. のように処理されるため、これは、必要であると、考えていないだろう

      しかし、MySQLは、少なくともユーザ定義の変数が関与していないときはこのようにはしません。証拠としてこの簡単なテストを参照してください:

      [email protected]:playground > select a, @r:[email protected]+1 as r from bar, (select @r := 0) sq; 
      +------+------+ 
      | a | r | 
      +------+------+ 
      | 1 | 1 | 
      | 1 | 2 | 
      | 1 | 3 | 
      | 1 | 4 | 
      | 1 | 5 | 
      | 1 | 6 | 
      | 1 | 7 | 
      | 1 | 8 | 
      | 1 | 9 | 
      | 1 | 10 | 
      | 2 | 11 | 
      | 2 | 12 | 
      | 2 | 13 | 
      | 2 | 14 | 
      | 2 | 15 | 
      +------+------+ 
      15 rows in set (0.00 sec) 
      
      [email protected]:playground > select a, @r:[email protected]+1 as r from bar, (select @r := 0) sq group by a; 
      +------+------+ 
      | a | r | 
      +------+------+ 
      | 1 | 1 | 
      | 2 | 11 | 
      +------+------+ 
      2 rows in set (0.00 sec) 
      
  • 0

    あなたは内部使用してそれを行うことができ、同じ結果と参加

    mysql> select DONATUR,COUNT(DISTINCT AREA) ,@curRank := @curRank + 1 AS rank from funding,(SELECT @curRank := 0) r group by Donatur;    +---------+----------------------+------+ 
    | DONATUR | COUNT(DISTINCT AREA) | rank | 
    +---------+----------------------+------+ 
    | Mr.X |     3 | 1 | 
    | Mr.Y |     1 | 2 | 
    | Mr.Z |     2 | 3 | 
    | sss  |     0 | 4 | 
    | wwww |     0 | 5 | 
    +---------+----------------------+------+ 
    5 rows in set (0.00 sec) 
    
    SELECT x.DONATUR,x.area,if(x.rank>y.rank,y.rank,x.rank) AS rank FROM (select DONATUR,COUNT(DISTINCT AREA) as area ,@curRank := @curRank + 1 AS rank from funding,(SELECT @curRank := 0) r group by Donatur) x LEFT JOIN (select DONATUR,COUNT(DISTINCT AREA) as area ,@curRank2 := @curRank2 + 1 AS rank from funding,(SELECT @curRank2 := 0) r group by Donatur) y on y.rank<>x.rank and x.area=y.area; 
    +---------+------+------+ 
    | DONATUR | area | rank | 
    +---------+------+------+ 
    | Mr.X | 3 | 1 | 
    | Mr.Y | 1 | 2 | 
    | Mr.Z | 2 | 3 | 
    | sss  | 0 | 4 | 
    | wwww | 0 | 4 | 
    +---------+------+------+ 
    5 rows in set (0.00 sec) 
    
    を設定するに
    関連する問題