2015-01-09 4 views
1

Я использую следующий запрос для возврата идентификаторов формы с их идентификаторами вложений. Каждая форма может не иметь вложений, одного приложения или двух вложений.MySQL Извлечение строк и преобразование их в столбцы

SELECT form.id  AS 'Form ID', 
     attachment.id AS 'Attachment ID' 
FROM form, 
     attachment 
WHERE form.id = attachment.form_id; 

Я получения результатов следующим образом:

+---------+---------------+ 
| Form ID | Attachment ID | 
+---------+---------------+ 
| 1  | 1    | 
| 1  | 2    | 
| 2  | 3    | 
| 3  | 4    | 
| 5  | 5    | 
| 5  | 6    | 
| 6  | 7    | 
+---------+---------------+ 

Я пытаюсь выяснить способ получения результатов следующим образом:

+---------+-------------------+-------------------+ 
| Form ID | Attachment ID - 1 | Attachment ID - 2 | 
+---------+-------------------+-------------------+ 
| 1  | 1     | 2     | 
| 2  | 3     | NULL    | 
| 3  | 4     | NULL    | 
| 4  | NULL    | NULL    | 
| 5  | 5     | 6     | 
| 6  | 7     | NULL    | 
+---------+-------------------+-------------------+ 
+0

http://stackoverflow.com/questions/27563172/please-anyone-help-about-my-case-in-mysql-query?noredirect=1#comment43552043_27563172.This может быть помощь вы. –

+0

И не более 2 приложений? Просто выполните LEFT JOIN с той же таблицей и проверьте вложение id2> attachment id1. – jarlh

+0

Это никогда больше, чем 2. Как проверить различные идентификаторы вложений? – AlGallaf

ответ

2

Используйте агрегацию и left join:

SELECT f.id as `Form ID`, 
     MIN(a.id) as `Attachment ID - 1` , 
     (CASE WHEN MIN(a.id) <> MAX(a.id) THEN MAX(a.id) END) as `Attachment ID - 2` 
FROM form f left join 
     attachment a 
     on f.id = a.form_id 
GROUP BY f.id; 
1

Попробуйте это:

SELECT FormID, 
     MAX(CASE WHEN AttachmentNo % 2 = 1 THEN AttachmentID ELSE 0 END) AS 'Attachment ID - 1', 
     MAX(CASE WHEN AttachmentNo % 2 = 0 THEN AttachmentID ELSE 0 END) AS 'Attachment ID - 2' 
FROM (SELECT f.id AS FormID, a.id AS AttachmentID, 
      IF(@formId = @formId:=f.id, @id:[email protected]+1, @id:=1) AS AttachmentNo 
     FROM form f 
     LEFT JOIN attachment ON f.id = a.form_id, (SELECT @formId:= 0, @id:=0) AS A 
     ORDER BY f.id. a.id 
    ) AS A 
GROUP BY FormID 
Смежные вопросы