2016-09-12 3 views
0

商品の表があります。この表はSELECT from X ORDER by Yクエリで作成されました。私は連続した行数や順序(1,2,3 ..)を追加したい。MySQLクエリ - 注文/数を含むフィールドを更新しますが、別のフィールドに基づいて再び1から開始します。

ただし、商品カテゴリまたは仕入先が変更された場合、この数を1にリセットします。 (私は、製品カテゴリーとベンダーの組み合わせを照会する際に並べ替えるための命令を出します)。

この問題は、より大きな問題に関連するサブ問題の簡素化です。だから、PHPを含む他のソリューションは関係ありません。

は、ここで、サンプルテーブルです:

+--------------+------------------+-----------+-----------+ 
| product_name | product_category | vendor_id | sortorder | 
+--------------+------------------+-----------+-----------+ 
| Product 1 | A    |   1 |   0 | 
| Product 2 | A    |   1 |   0 | 
| Product 3 | A    |   1 |   0 | 
| Product 4 | B    |   1 |   0 | 
| Product 5 | B    |   1 |   0 | 
| Product 6 | C    |   2 |   0 | 
| Product 7 | C    |   2 |   0 | 
| Product 8 | C    |   2 |   0 | 
| Product 9 | C    |   2 |   0 | 
| Product 10 | C    |   2 |   0 | 
+--------------+------------------+-----------+-----------+ 

これは、クエリが正常に実行された場合、それがどのように見えるべきかです:

+--------------+------------------+-----------+-----------+ 
| product_name | product_category | vendor_id | sortorder | 
+--------------+------------------+-----------+-----------+ 
| Product 1 | A    |   1 |   1 | 
| Product 2 | A    |   1 |   2 | 
| Product 3 | A    |   1 |   3 | 
| Product 4 | B    |   1 |   1 | 
| Product 5 | B    |   1 |   2 | 
| Product 6 | C    |   2 |   1 | 
| Product 7 | C    |   2 |   2 | 
| Product 8 | C    |   2 |   3 | 
| Product 9 | C    |   2 |   1 | 
| Product 10 | C    |   2 |   1 | 
+--------------+------------------+-----------+-----------+ 

私は主に、この答えに関連したさまざまなクエリのTONを試してみました最初のクエリからこの結果を取得しますが、無駄になります。 Using LIMIT within GROUP BY to get N results per group?

このようなクエリを実行して注文することができます1 、2,3,10):私は1で再び開始する数である、欲しいものを達成していない

SET @pos = 0; 
UPDATE testtable SET sortorder = (SELECT @pos := @pos + 1); 

しかし、とき4.

製品3と製品間の「PRODUCT_CATEGORY」変更不正な構文で

が、これは私が何をしたいです:いつものように

SET @pos = 0; 
UPDATE testtable SET sortorder = 
// { if (product_category != [last product_category] 
// OR 
// if (vendor_id != [last vendor_id]) 
// } 
// THEN SET sortorder = 1 
// ELSE SET sortorder = (1+ [last sortorder] 
; 

おかげで...

EDIT-2016年9月12日

@ Fancypantsから溶液を試してみる。実際には、最初は動作しないように見えますが、 "product_name"フィールドのソート順と関係しています。製品5は製品5の前に置かれます(1が5の前に来る)。代わりに整数フィールドを使用することでそれを説明すると、結果は完璧です。

答えて

0

ご希望の結果に誤りがあると思われます。プロダクト9と10の並べ替え順序は4と5にする必要があります。

は、ここであなたがそれを行うことができます方法は次のとおりです。

UPDATE t 
JOIN (

    SELECT 
    t.* 
    , @rc := IF(@prevpc != product_category OR @prevv != vendor_id, 1, @rc + 1) AS so 
    , @prevpc := product_category 
    , @prevv := vendor_id 
    FROM 
    t 
    , (SELECT @prevpc := NULL, @prevv := NULL, @rc := 0) var_init_subquery 
    ORDER BY product_category, vendor_id, product_name 

) sq ON t.product_name = sq.product_name 
SET t.sortorder = sq.so; 
  • はい、あなたは私のエラーに関する正しいsqlfiddle
+0

で、それは生きて働いてご覧ください。 (私はそれをやろうと思っていた)。ありがとう、私はあなたのソリューションを試し、返信します。 – Kevin

+0

これは私の編集で説明した調整を行った後に機能するようです。ありがとうございました!! – Kevin

関連する問題