Intereting Posts

mysql заменяет элементы с номером строки

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

например

 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. Свернутый дизайн

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

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

СОЗДАТЬ ВОПРОС

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

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

 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. во всех случаях вам нужно использовать одну запись для каждой основной пары +.
    1. создать таблицу product_list (prodid, subid), где субад может быть нулевым для непродуктовых таблиц
    2. присоединяйте продукты таблицы продуктов один раз, чтобы получить мастер и второй раз, чтобы получить sub (скажите мне, если вам нужен запрос) и group by product_list.prodid
  2. показ продуктов – выберите один из
    1. сделайте дизайн, который позволяет вам поместить 2 предмета в один квадрат.
    2. поместите кнопку «бонусный продукт» с анимацией всплывающих окон или javascript, показывая другой продукт
    3. при наведении курсора мыши разворачивайте продукт вправо или влево в зависимости от положения.

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

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

 Table product ------------- pid --- name type Table productPair ----------------- pid* --- part1* part2* - 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 | +----+------+------+ 

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

Да, я также предлагаю вам перепроектировать здесь, но для quik-n-грязного результата просто добавьте в свой SQL что-то вроде этого :

 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 ; 

Моя среда – 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