MySQL检索行并将其转换为列
我使用下面的查询返回表单ID及其附件ID。每个表单可以没有附件、一个附件或两个附件MySQL检索行并将其转换为列,mysql,sql,select,join,pivot,Mysql,Sql,Select,Join,Pivot,我使用下面的查询返回表单ID及其附件ID。每个表单可以没有附件、一个附件或两个附件 SELECT form.id AS 'Form ID', attachment.id AS 'Attachment ID' FROM form, attachment WHERE form.id = attachment.form_id; 我检索的结果如下: +---------+---------------+ | Form ID | Attachmen
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 |
+---------+-------------------+-------------------+
我试图找出一种检索结果的方法,如下所示:
+---------+---------------+
| 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 |
+---------+-------------------+-------------------+
使用聚合和左联接:
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;
选择f.id作为“表单id”,
最小值(a.id)为“附件id-1”,
(最小(a.id)最大(a.id)然后最大(a.id)结束时的情况)作为`附件id-2`
从表格f左连接
附件a
在f.id=a.form\u id上
按f.id分组;
试试这个:
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:=@id+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
可能会对你有帮助。而且永远不会超过2个附件?只需对同一个表执行左连接,并检查附件id2>附件id1。它永远不会超过2。如何检查不同的附件ID?算了吧,它将无法正常工作。