这是我的表结构,在这里我需要交换项目。这意味着,您可以看到类型 3 总是成对出现(类型 3 项目总是成对
)。
我只是命名配对项目,以了解成对的第一个 1 是主项,第二个是子项。 所以对的主人不应该出现在 5、10 和 15 位置
如果到了那个地方我需要将下一个项目交换到那个地方(下一个项目将是子它不应该被视为下一个项目)
例如
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
截图
需要进一步的帮助
我给你表结构和测试数据,如果你有想法,请与我分享!
创建查询
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
This Query did what i exactly need ... But In my case pid is Primary key. so i can't get the results in 1 to 15 order . So can i do this row number... how can i do
欢迎各种建议,甚至是 php 中的解决方案 让我在 mysql 或任何其他方式中这样做是可能的..
最佳答案
所以,基本上你的问题可以表述为:
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 返回行的顺序。
无论如何,最简单的方法是在应用程序中执行此操作。将结果作为数组抓取并扫描,如果您发现两个产品位置不正确,只需将它们在数组中打乱即可。
关于php - mysql交换项目与行号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5675277/