MySQL复杂的自我加入

时间:2013-11-28 15:19:31

标签: mysql self-join

我有一张这样的桌子:

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

我正在尝试编写一个会产生类似结果的查询

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

很明显,只有三个名字,我正在尝试编写查询,但我不能。有人可以帮助我

1 个答案:

答案 0 :(得分:8)

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

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 |
+------+-------+-------+