php - mysql交换项目与行号

标签 php mysql arrays swap

这是我的表结构,在这里我需要交换项目。这意味着,您可以看到类型 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 

截图

  1. perfect placement
  2. Collapsed design

需要进一步的帮助

我给你表结构和测试数据,如果你有想法,请与我分享!

创建查询

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/

相关文章:

php - 一次将值插入到多个 MySQL 表中

php - HTML5音频元素

mysql - Liquibase 无法在 MySQL 上添加非空、唯一、当前时间戳

点击页面其他类别后 PHP session 变量丢失

php - 用于进行2条sql更新查询的多维数组

java - ArrayList 的速度是数组的两倍多吗?

php - 在命名空间下使用 PHPThumb 类时遇到问题

php - 您的要求无法解析为一组可安装的软件包。 - Laravel Lumen 邮件

mysql - 插入多行PDO

python - 在 NumPy 中对数组进行排序,在一列上升序,在另一列上降序