MySQL обменять элементы с номером строки - PullRequest
4 голосов
/ 15 апреля 2011

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

например

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. идеальное размещение
  2. свернутый дизайн

ДЛЯ ДАЛЬНЕЙШЕЙ ПОМОЩИ

Я ДАЛА ВАМ ТАБЛИЦУ СТРУКТУРУ И ИСПЫТАНИЯ, ПОЖАЛУЙСТА, ЕСЛИ У ВАС ИДЕЯ ПОДЕЛИТСЯ МНЕ!1031 *

Моя работа и результат

  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 или любым другим способом сделать это ..

Ответы [ 5 ]

2 голосов
/ 08 мая 2011

Итак, в основном вашу проблему можно сформулировать так:

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 не указан.

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

1 голос
/ 10 мая 2011

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

Да, я также предлагаю вам перепроектировать здесь, но для результата quik-n-dirty просто добавьте в свой 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 голос
/ 06 мая 2011

Я думаю, что вам нужно изменить дизайн таблиц, чтобы избежать необходимости менять строки - помните, порядок строк в реляционной таблице должен быть несущественным, а 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     |
+----+------+------+

В этой форме нетНеобходим порядок строк, отношения кодируют характер каждой пары, а не положение данных в таблице.

1 голос
/ 17 апреля 2011

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


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

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

  1. во всех случаях вам нужно использовать одну запись на master + sub pair.
    1. создать таблицу product_list (prodid, subid), где subid может быть нулевым для таблиц, не относящихся к продукту
    2. присоединиться к продуктам таблицы продуктов один раз, чтобы получить master, и второй раз, чтобы выбрать sub (скажите, если вынужен запрос) и сгруппируйте по product_list.prodid
  2. , показывая продукты - выберите один из
    1. и создайте дизайн, позволяющий поместить 2 элемента в один квадрат.
    2. поместите кнопку «бонусный продукт» с анимацией всплывающего окна или javascript, показывая другой продукт
    3. при наведении курсора, разверните продукт вправо или влево в зависимости от позиции.
...