2011-04-15 46 views
4
のmysqlスワップアイテム

これは私のテーブル構造です。ここではアイテムを交換する必要があります。つまり、タイプ3は常にペアになっています(type 3 items are always paired)。 私はちょうど最初の1ペアのマスターを理解するためのペアアイテムを指定し、2番目のサブです。例えばSo master of the pair should not come 5,10 and 15 positions それは私がその場所に次のアイテムを交換する必要がある場所(neaxt項目がそれをサブされますが、次の項目とみなすべきではない)ことを来る場合行番号が

pid 10 (comes in 10 position) i need to swap it like this 
pid type name 
..  .. .. 
10  2 B2 

11  3 E1(master) 
12  3 A2(sub) 

..  .. .. 

pid type pname 
    1  1  A 
    2  1  B 
    3  2  C 
    4  3  D(mater) 
    5  3  E(sub) 

    6  1  A1 
    7  2  B1 
    8  1  C1 
    9  2  D1 
    10  3  E1(master)  

    11  3  A2(sub) 
    12  2  B2 
    13  1  C2 
    14  2  D2 
    15  1  E3 

スクリーンショット

  1. perfect placement
  2. Collapsed design

助けを

私はあなたのテーブル構造を与え、TEST DATA、私と一緒にIDEAのシェアを持って下さいませ!

CREATE TABLE IF NOT EXISTS `table_swap1` (
    `pid` int(11) NOT NULL AUTO_INCREMENT, 
    `type` int(11) NOT NULL, 
    `name` varchar(50) NOT NULL, 
    PRIMARY KEY (`pid`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=17; 

INSERTクエリ

INSERT INTO `table_swap1` (`pid`, `type`, `name`) VALUES 
    (1, 1, 'A'),(2, 1, 'B'),(3, 2, 'D'),(4, 3, 'E(master)'), 
    (5, 3, 'f(sub)'),(6, 1, 'A1'),(7, 2, 'B1'),(8, 1, 'C1'), 
    (9, 2, 'D1'),(10, 3, 'E1(master)'),(11, 3, 'A2(sub)'),(12, 2, 'B2'), 
    (13, 1, 'C2'),(14, 2, 'D2'), (15, 1, 'E2'); 

私の仕事と

SELECT aa.pid, (

    CASE aa.pid 
    WHEN bb.apid 
    THEN bb.atype 
    WHEN bb.bpid 
    THEN bb.btype 
    WHEN bb.cpid 
    THEN bb.ctype 
    ELSE aa.type 
    END 
    ) 
    TYPE , (

    CASE aa.pid 
    WHEN bb.apid 
    THEN bb.aname 
    WHEN bb.bpid 
    THEN bb.bname 
    WHEN bb.cpid 
    THEN bb.cname 
    ELSE aa.name 
    END 
    )name 
    FROM (

    SELECT a.pid +1 apid, a.TYPE atype, a.NAME aname, 
      b.pid +1 bpid, b.type btype, b.name bname, 
      c.pid -2 cpid, c.type ctype, c.name cname 
    FROM table_swap1 a, table_swap1 b, table_swap1 c 
    WHERE MOD(a.pid, 5) =0 
    AND a.pid +1 = b.pid 
    AND a.type =3 
    AND a.type = b.type 
    AND a.pid +2 = c.pid 
    )bb, table_swap1 aa 
    GROUP BY pid 

を結果は、このクエリは、私は正確に を必要とするものでした...しかし、私の場合はクエリを作成pidは主キーです。 私は1から15 の順序で結果を得ることができません。だから、私は

を行うことができます提案のすべての種類は、PHPさせて頂いて でソリューションをしても歓迎されているか、この行番号... を行うことができますすることはMySQLやこれを行うには他の方法でこれを可能..です

+0

私はとにかく、なぜあなたは「スワップ」する必要があるものをご使用後の... MySQLで任意の項目を理解していませんか?スワップは、レコードを取り出して別の場所に挿入するイメージをもたらしますが、これはmysqlでは無意味です。レコードをフィルタリングして、必要な方法でソートすることができます。たぶんあなたはそれがあなたのものであるかを正確に説明してください。 –

+0

ええ、実際には、私は3列に商品をリストアップしています。タイプ1と2の商品または別々に来ますが、5,10,15ポジションで1つの大きなボックスになります。そのボックスを置くスペースはありません次のアイテムをその場所に入れ替えるのが好きです... – Gowri

+0

更新または選択? –

答えて

1

以前のソリューション - 悪いソリューション


編集:私は解決策が、この場合には本当に可能だとは思いません。アイテムの順序を変更することも可能です(いつもそうではありません)。期限切れになるアイテムは、後で期限が切れるアイテムの後になる可能性があります。あなたは何ができるか

:あなたはマスター+サブペアごとに1つのエントリを使用する必要があるすべての場合に

    1. 非製品テーブル
    2. はサブをフェッチするために、マスターと第二の時間を取得するために、一度、製品テーブルの製品に参加するためにサブIDがNULLとなる可能性があるテーブルproduct_list(サブID PRODIDを)作る(クエリを必要とするなら、私に教えて)と、 group by product_list。製品を示す
  1. をPRODID - あなたは1平方に2つのアイテムを置くことを可能にする設計を行い
    1. のいずれかを選択します。
    2. 他の商品を表示するポップアップやJavaScriptのアニメーションを「ボーナス商品」ボタンに入れてください
    3. on mouseover商品は位置によっては左右に拡大してください。
+0

おっと!、返信ありがとう、私はこれを説明する方法はわかりません、はい、それは設計上の問題です。http://awesomescreenshot.com/085bjcvbcここに15の製品が掲載されている私のページです...画面には、あなたがこのことについて考えを持っている場合は、私に提案をお願い – Gowri

1

私はあなたが行を交換することを避けるために、あなたのテーブルを再設計する必要があると思う - 行の順序は、リレーショナルテーブルに軽微である必要があり、覚えている、とMySQLはリレーショナルDBです。ここで

が可能な再設計である - 私が正しくあなたの質問を理解していないなら、私に知らせても:製品は、ボックス内のペアである場合には

Table product 
------------- 
pid 
--- 
name 
type 

Table productPair 
----------------- 
pid* 
--- 
part1* 
part2* 

、あなたは、製品としての両方を入力し、製品のペアとして、同じキーを使用します。適切な制約を持つペアが一種類のみ1と1タイプ2製品で構成されているように、あなたがデザインをモデル化することができ、など

いくつかの例のデータ:この形式で

+------------------+ 
|product   | 
+------------------+ 
|PID |type |name | 
+----+------+------+ 
|1 |1  |A  | 
|2 |1  |B  | 
|3 |2  |C  | 
|4 |3  |D  | 
|5 |3  |E  | 
+----+------+------+ 

+------------------+ 
|productPair  | 
+------------------+ 
|PID*|part1*|part2*| 
+----+------+------+ 
|4 |1  |3  | 
|5 |2  |3  | 
+----+------+------+ 

、行の順序の必要はありません関係はテーブル内のデータの位置ではなく、各ペアの性質をエンコードします。

2

だから、基本的にあなたの問題のように処方することができます:どのような物事を複雑にすることは何のためには、あなたのテーブルに存在しないことで、注文せずに、ために一定の「位置」を定義することは不可能である

The first product of two adjacent products of type 3 cannot be placed 
in a position which is a multiple of 5. 

あなたの製品。 ORDER BYのないSELECTの返される行の順序は指定されていません。

とにかく、これを行う最も簡単な方法はアプリケーションです。結果を配列として取得してスキャンし、適切な位置にない2つの製品が見つかった場合は、アレイ内でそれらをシャッフルします。

+0

...それは完全に置かのシュートが、マスター・レコードが10になれば、それは項目を選択するときに、私はそれを交換する必要がバグだらけになること複雑です – Gowri

+0

..あなたは私のコード例を与えることができ – Gowri

1

はい、私はまた、あなたがここに再設計することをお勧めしますが、QUIK-N-汚い結果のために、ちょうどあなたのSQLにthisのようなものを追加:私の環境では、SQL Serverです

select 
    table_swap1.*, 
    @row_number := @row_number + 1 as row_number, 
    0 = mod(@row_number, 5) is_fifth 
from 
    table_swap1, 
    (SELECT @row_number := 0) tmp 
; 
1

を。私はその構文で私の解決策を書いた...私は(SQL Serverオリジナルの下に)MySQLで書き直そうとしますが、私が正しく書き直しているかどうかにかかわらず、私のポイントを理解することができます。基本的にbbサブクエリを使用して不定結合(デカルト積)を作成すると、masterの行が5の倍数になるpidが他のすべての行に使用できるようになり、一致する行が再計算されます(および)隣接する行)をResequence列に変換します。あなたのデータを正しく理解していれば、type=3 ANDというフレーズを省略することもできます。

SELECT (CASE 
WHEN aa.pid = bb.pid THEN aa.pid+1 
WHEN aa.pid-1=bb.pid THEN aa.pid+1 
WHEN aa.pid-2=bb.pid THEN aa.pid-2 
ELSE aa.pid END) ResequencePid 
, aa.pid, aa.type, aa.name 
FROM table_swap1 aa, 
(SELECT pid FROM table_swap1 WHERE type=3 AND pid%5=0 AND name LIKE '%(master)') bb 
/* optional */ ORDER BY 1 

/* MySQL version */

SELECT (CASE 
WHEN aa.pid = bb.pid THEN aa.pid+1 
WHEN aa.pid-1=bb.pid THEN aa.pid+1 
WHEN aa.pid-2=bb.pid THEN aa.pid-2 
ELSE aa.pid END) ResequencePid 
, aa.pid, aa.type, aa.name 
FROM table_swap1 aa, 
(SELECT pid FROM table_swap1 WHERE type=3 AND MOD(pid, 5)=0 AND name LIKE '%(master)') bb 
/* optional */ ORDER BY 1 
+0

** Gowri、私の解決策を見てください!**私はあなたのためにそれを提供するように努力しました。 – RodneyL