MySQL复杂的自我加入

 射手座的双子55 发布于 2023-02-14 04:43
  • php
  • 我有这样一张桌子:

    id | name
    --------
    1  | test
    2  | test1
    3  | test
    4  | test1
    5  | test2
    

    我正在尝试编写一个会给出这样结果的查询

     test   |  test1 | test2
    ----------------------------
     1      |   2    |   5
     3      |   4    |
    

    而且很明显只有三个名字,我正在尝试编写查询,但我不能.有人能帮我吗

    1 个回答
    • 好吧,只是为了安抚怀疑者.请注意,我并不是认真地提倡这个解决方案,因为它只是不具备可扩展性 - 并且使其可扩展(通过准备好的语句和sproc,坦率地说,单调乏味)......

      DROP TABLE IF EXISTS my_table;
      
      CREATE TABLE my_table
      (id INT NOT NULL PRIMARY KEY
      ,name VARCHAR(12) NOT NULL
      );
      
      INSERT INTO my_table VALUES
      (1  ,'test'),
      (2  ,'test1'),
      (3  ,'test'),
      (4  ,'test1'),
      (5  ,'test2');
      
      
      SELECT MAX(CASE WHEN name = 'test' THEN id END) 'test' 
           , MAX(CASE WHEN name = 'test1' THEN id END) 'test1' 
           , MAX(CASE WHEN name = 'test2' THEN id END) 'test2' 
        FROM 
           ( SELECT x.*
                  , COUNT(*) rank 
               FROM my_table x 
               JOIN my_table y 
                 ON y.name = x.name 
                AND y.id <= x.id 
              GROUP 
                 BY id
           ) z GROUP BY rank;
      
      +------+-------+-------+
      | test | test1 | test2 |
      +------+-------+-------+
      |    1 |     2 |     5 |
      |    3 |     4 |  NULL |
      +------+-------+-------+
      

      2023-02-14 05:17 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    热门标签
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有