2011-04-15 59 views
4

這是我的表結構,在這裏我需要交換項目。這意味着,你可以看到類型3總是配對(type 3 items are always paired)。 我剛剛命名配對項目,理解第一對是主,第二個是子。 So master of the pair should not come 5,10 and 15 positions 如果說到那個地方,我需要到下一個項目換到那個地方(neaxt項目將分吧不應該被視爲下一個項目)mysql與行號交換項目

例如

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

獲得進一步幫助

我給你的表結構和測試數據,如果您有任何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 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中呢?Swap帶來了取出記錄並將其重新插入到不同位置的映像,但這在mysql中毫無意義,因爲您可以按照自己想要的方式篩選記錄並對其進行排序。也許你應該更好地解釋一下你究竟是什麼。 – 2011-04-15 10:26:11

+0

是啊,其實我列出的產品有三排...... 1型和2型產品或單獨出售,但配對產品將在一個大盒子中,在5,10和15個位置..沒有空間放置該盒子我喜歡將下一個項目交換到那個地方... – Gowri 2011-04-15 10:31:44

+0

UPDATE或SELECT? – 2011-04-17 05:59:15

回答

1

以前的解決方案 - 不好解決


編輯:我不認爲一個解決方案是真的有可能在這種情況下。即使你有可能重新排列項目(事實並非總是如此),可能會發生的情況是,更早過期的項目將在稍後過期的項目之後。

你可以做什麼:

  1. 在您需要使用每個主+子對一個項目的所有情況。
    1. 使表所屬類別(PRODID,子編號),其中子編號可以爲非產品表
    2. 加入產品表產品一旦獲取主站和第二次取子(告訴我,如果你需要查詢),併爲空按產品列表分組。PRODID
  2. 顯示產品 - 選擇
    1. 一個做一個設計,讓你把2項在一個廣場。
    2. 在彈出式窗口或javascript動畫上放置一個按鈕「獎勵產品」,顯示其他產品
    3. 鼠標懸停根據位置將產品向右或向左展開。
+0

哎呀!,謝謝你的回覆尼克,我不知道如何解釋這一點,是的,這是一個設計問題..請檢查了這一點http://awesomescreenshot.com/085bjcvbc這裏是我的網頁上列出15產品...在屏幕截圖中它是完全放置的,但是如果主記錄在10時它將是越野車,所以我需要在選擇項目時交換它.. – Gowri 2011-04-18 04:09:10

1

我認爲你需要重新設計你的表,以避免換行 - 記住,行的順序應該是一個關係表無關緊要,而MySQL是一個關係數據庫。

這裏是一個可能的重新設計 - 儘管讓我知道,如果我不理解正確的話你的問題:

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

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

當一個產品是在一個盒子裏,你進入它既可作爲產品的一對,作爲產品配對,使用相同的密鑰。有了適當的約束,你可以模擬設計,這樣對只由一個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返回行的順序。

無論如何,最簡單的方法是在應用程序中。以數組形式抓取結果,對其進行掃描,如果發現兩個產品不在正確的位置,只需將它們在數組中進行混洗即可。

+0

你能給我的示例代碼.. – Gowri 2011-05-09 03:33:07

+0

請給我建議,如果你有這個想法。它很複雜 – Gowri 2011-05-09 06:45:52

1

是的,我也建議你在這裏重新設計,但對於QUIK-N-骯髒的結果只是添加到您的SQL像this

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服務器。我用這種語法編寫了我的解決方案......我將嘗試在MySQL中進行重寫(在SQL Server原始版本下面),但我相信您會理解我的觀點(無論我是否已經正確重寫)。基本上,使用bb子查詢來建立未指定的聯接(笛卡爾積),以便落入5的倍數的每個master行的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 2011-05-11 14:43:27