2013-11-28 1 views
1

я имея таблицу, как это:MySQL комплекс автообъединение

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

Я пытаюсь написать запрос, который будет давать результат, как этот

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

И очень ясно, будет только три имени, я пытаюсь написать запрос, но я не мог. Может кто-нибудь мне помочь

+0

Если кто-то есть проблемы, выясняя это, он хочет, чтобы 'name1' был идентификатором столбца, где' name' является 'test',' name2' является 'name == test1' и' name3' является 'name == test2'. – h2ooooooo

+0

@Mosty Mostacho Я думаю, что ваш комментарий, имеющий некоторые действительные баллы, вы можете прояснить ситуацию? –

+0

Рассмотрите возможность обработки проблем отображения данных в коде уровня представления/уровне приложения. – Strawberry

ответ

8

Ну, просто чтобы успокоить сомневающихся. Обратите внимание, что я не серьезно выступает как решение, потому что это просто не очень масштабируемым - и делает его масштабируемым (с помощью подготовленных заявлений и 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 | 
+------+-------+-------+ 
+1

sql-fu силен в этом ... – ethrbunny

+0

@Strawberry большое вам спасибо, Боже, помогите вам. Ты замечательный –

+1

И это можно было сделать в 100% -ом обычном SQL ... Я не видел, чтобы это пришло :) –