2011-04-15 2 views
4

Это моя структура таблицы. Здесь мне нужно поменять элементы. Это означает, что тип 3 всегда приходит в паре (type 3 items are always paired). Я только что назвал парные элементы для понимания первого 1 в паре - это мастер, а второй - под. So master of the pair should not come 5,10 and 15 positions , если речь идет, что место мне нужно поменять следующий пункт в этом месте (neaxt деталь будет суб- она ​​не должна рассматриваться в качестве следующего пункта)mysql swap элементы с номером строки

, например

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

ДЛЯ ДАЛЬНЕЙШЕГО HELP

Я ДАТЬ ВАМ ТАБЛИЦЫ И СТРУКТУРА ДАННЫХ ИСПЫТАНИЯ, ПОЖАЛУЙСТА, ЕСЛИ У ВАС ЕСТЬ ИДЕЯ, поделитесь со мной!

Создание запроса

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 это бессмысленно, так как вы можете фильтровать записи и сортировать их по своему желанию. Может быть, вам лучше объяснить, что это за вас. –

+0

Да, на самом деле я перечисляю продукты в три ряда .. Тип 1 и 2 изделия или раздельно, но парный предмет будет в одной большой коробке, в позиции 5, 10 и 15. я хотел бы поменять следующий элемент на то место ... – Gowri

+0

UPDATE или SELECT? –

ответ

1

предыдущее решение - плохое решение


Edit: я не думаю, что решение действительно возможно в этом случае. Даже если вам удастся переупорядочить элементы (что не всегда будет так), может случиться так, что те, которые истекают раньше, будут после элементов, срок действия которых истекает позже.

Что вы можете сделать:

  1. во всех случаях необходимо использовать один вход на мастер + юг пару.
    1. сделать таблицу product_list (ProdID, Subid), где субидентификатор может быть нулевым для таблиц без продукции
    2. таблицу соединения продукт продукты один раз, чтобы принести хозяину и во второй раз, чтобы принести к югу (скажите мне, если вам нужен запрос) и group by product_list.PRODID
  2. показывая продукты - выбрать один из
    1. сделать дизайн, который позволяет поставить 2 пунктов в один квадратный.
    2. наденьте кнопку «бонусный продукт» с анимацией всплывающих окон или javascript, показывая другой продукт.
    3. на наведении мыши развернуть продукт вправо или влево в зависимости от положения.
+0

oops!, Спасибо за ответ ник, я не знаю, как это объяснить, да, это проблема дизайна .. пожалуйста, проверьте это http://awesomescreenshot.com/085bjcvbc вот моя страница с 15 перечисленными продуктами ... в скриншоте он отлично размещен, но если основная запись будет в 10, это будет ошибкой, поэтому мне нужно поменять ее при выборе элементов. – Gowri

1

Я думаю, что вам нужно, чтобы перепроектировать свои таблицы, чтобы избежать того, чтобы поменять местами строки - помните, что порядок строк должен быть несущественным в реляционной таблице, и MYSQL является реляционной БД.

Вот возможный редизайн - хотя, дайте мне знать, если я не понимаю ваш вопрос правильно:

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

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

Когда продукт пара в коробке, вы вводите его как в качестве продукта, и как продукт, с тем же ключом. При наличии соответствующих ограничений, вы можете моделировать дизайн так, что пары только из одного типа 1 и один type2 продукта и т.д.

Некоторые примеры данных:

+------------------+ 
|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. 

Что усложняет дело в том, что там нет порядка в таблице, и без того, что невозможно определить постоянную «позицию» для вашей продукции. Порядок возвращаемых строк для SELECT без ORDER BY не указан.

В любом случае, самый простой способ сделать это в приложении. Возьмите результаты в виде массива, сканируйте его, и если вы найдете два продукта, которые не находятся в правильном положении, просто перетасуйте их в массив.

+0

вы можете дать мне пример кода .. – Gowri

+0

, пожалуйста, дайте мне предложение, если у вас есть идея об этом .Осложно – Gowri

1

Да, я также предлагаю вам перепроектировать здесь, но для QUIK-н-грязный результат просто добавить в свой 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 Server. Я написал свое решение в этом синтаксисе ... Я попытаюсь переписать в MySQL (ниже оригинала SQL Server), но я уверен, что вы поймете мою точку зрения (правильно ли я переписал). В принципе, используйте подзапрос bb, чтобы установить неопределенное соединение (декартово произведение), так что pid каждой строки master, которая падает на несколько из пяти, доступна для всех других строк, затем пересчитывает строки, которые соответствуют ( и затрагиваемых смежные строки) в колонку 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

** Гоури, пожалуйста, взгляните на мое решение! ** Я работал, чтобы предоставить его вам (и другим), и мне кажется, что я ближе всего к тому, что вы просили. – RodneyL

Смежные вопросы