【问题标题】:How to rotate data among 3 groups?如何在 3 组之间轮换数据?
【发布时间】:2016-09-01 23:42:36
【问题描述】:

假设我有 A、B 和 C 组。每个组都有 X 个项目。使用什么算法,以便我可以以每次从每个组中取一个的方式整理这里的所有项目。

IE。 鉴于 A 和 B 有 2 项,C 有 3 项。我应该显示如下列表:

 1. A - Item 1
 2. B - Item 1
 3. C - Item 1
 4. A - Item 2
 5. B - Item 2
 6. C - Item 2
 7. C - Item 3

我正在从 MySQL 数据库中提取这些数据,因此如果可以在 MySQL 中执行此操作,我将不胜感激。

那么有什么好的算法呢?我想这将是很多事情的常见场景,所以应该已经有一些有效的方法来做到这一点。不过我不知道谷歌是为了什么,我没有得到任何好的结果。

有人愿意对此有所了解吗?

【问题讨论】:

    标签: mysql algorithm sorting


    【解决方案1】:

    您可以通过以下查询来完成这样的结果:

    [您实际上可以在任何组之间轮换数据]

    SELECT 
    t.item_type,
    t.item_name
    FROM 
    (
     SELECT 
     item_type,
     item_name,
     IF(@prev = item_type , @rank := @rank + 1 , @rank := 0) rankNumber,
     @prev := item_type
     FROM itemstable , (SELECT @prev := NULL, @rank := 0) vars
     ORDER BY item_type,item_name
    ) t
    ORDER BY t.rankNumber,t.item_type;
    

    SQL FIDDLE DEMO


    使用模式测试数据:

    如果您无法访问 SQL FIDDLE

    DROP TABLE IF EXISTS `itemstable`;
    CREATE TABLE `itemstable` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `item_type` varchar(10) CHARACTER SET utf8 NOT NULL,
      `item_name` varchar(50) CHARACTER SET utf8 NOT NULL,
      PRIMARY KEY (`ID`)
    );
    INSERT INTO `itemstable` VALUES ('1', 'A', 'ITEM 1');
    INSERT INTO `itemstable` VALUES ('2', 'A', 'ITEM 2');
    INSERT INTO `itemstable` VALUES ('3', 'B', 'ITEM 1');
    INSERT INTO `itemstable` VALUES ('4', 'B', 'ITEM 2');
    INSERT INTO `itemstable` VALUES ('5', 'C', 'ITEM 1');
    INSERT INTO `itemstable` VALUES ('6', 'C', 'ITEM 2');
    INSERT INTO `itemstable` VALUES ('8', 'C', 'ITEM 3');
    

    对此测试数据运行上述查询,您将得到如下输出:

    item_type     item_name
    A              ITEM 1
    B              ITEM 1
    C              ITEM 1
    A              ITEM 2
    B              ITEM 2
    C              ITEM 2
    C              ITEM 3
    

    说明:

    • 首先根据ITEM_TYPE (A,B,C...)对数据进行排序,然后 再次根据 ITEM_NAME (ITEM1,ITEM2...) 对排序后的数据进行排序。
     item_type   item_name
       A          ITEM 1
       A          ITEM 2
       B          ITEM 1
       B          ITEM 2
       C          ITEM 1
       C          ITEM 2
       C          ITEM 3
    
    • 使同一类型下的项目粘在一起并排序 他们之间的顺序。
    • 现在假设您正在浏览这个 double 排序的数据。
    • 如果您找到属于以前见过的 ITEM_TYPE 的项目,那么您 将为这个刚刚看到的项目分配一个递增的排名编号。
    • 否则,(这意味着您刚刚看到一个属于新 ITEM_TYPE),您将分配一个为零的排名编号。

    【讨论】:

    • IF 在那里做什么?我有点困惑,因为我的实际查询包含一个 left join,这使得翻译有点困难。
    • 我已经添加了解释。请立即检查。
    • 如何使用left joininner join
    • LEFT JOININNER JOIN 在哪个条件下使用哪个表?请多解释一下。
    • 如果您想与itemsTable 进行连接,那么您可以将连接子句放在上述查询中的From itemsTable 之后。像这样...From itemsTable INNER JOIN YOUR_ANOTHER_TABLE ON YOUR_ANOTHER_TABLE.FIELD = itemstable.FIELD, (SELECT @prev := NULL, @rank := 0) vars....
    猜你喜欢
    • 1970-01-01
    • 2020-09-18
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多