如果您知道最大數爲12,則可以使用MAX
和CASE
獲取每個附件的行號。
SELECT
I.Id issue_id,
I.title,
MAX(CASE WHEN d.row_number = 1 THEN D.attachment END) attachment1,
MAX(CASE WHEN d.row_number = 2 THEN D.attachment END) attachment2,
MAX(CASE WHEN d.row_number = 3 THEN D.attachment END) attachment3,
MAX(CASE WHEN d.row_number = 4 THEN D.attachment END) attachment4,
MAX(CASE WHEN d.row_number = 5 THEN D.attachment END) attachment5,
MAX(CASE WHEN d.row_number = 6 THEN D.attachment END) attachment6,
MAX(CASE WHEN d.row_number = 7 THEN D.attachment END) attachment7,
MAX(CASE WHEN d.row_number = 8 THEN D.attachment END) attachment8,
MAX(CASE WHEN d.row_number = 9 THEN D.attachment END) attachment9,
MAX(CASE WHEN d.row_number = 10 THEN D.attachment END) attachment10,
MAX(CASE WHEN d.row_number = 11 THEN D.attachment END) attachment11,
MAX(CASE WHEN d.row_number = 12 THEN D.attachment END) attachment12
FROM Issues I
LEFT JOIN (
SELECT
a.issue_id,
@running:=if(@previous=a.issue_id,@running,0) + 1 as row_number,
@previous:=a.issue_id,
a.attachment
FROM Attachments a
JOIN (SELECT @previous := 0) r
ORDER BY a.issue_id, a.attachment
) D ON I.ID = D.issue_id
GROUP BY I.Id, I.Title
這裏是SQL Fiddle。
我必須進行編輯才能使每組的rownumber重置。應該現在工作。另外,per @ spencer7593的好評,我已經稍微更新了這個查詢。
- 編輯 -
針對OP的大約需要動態結果的評論,這應該工作:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'MAX(IF(d.row_number = ', d.row_number, ',D.attachment,NULL)) AS attachment', d.row_number)
) INTO @sql
FROM Issues I
LEFT JOIN (
SELECT
a.issue_id,
@running:=if(@previous=a.issue_id,@running,0) + 1 as row_number,
@previous:=a.issue_id,
a.attachment
FROM Attachments a
JOIN (SELECT @previous := 0) r
ORDER BY a.issue_id, a.attachment
) D ON I.ID = D.issue_id
;
SET @sql = CONCAT('SELECT I.Id issue_id,
I.title, ', @sql, '
FROM Issues I
LEFT JOIN (
SELECT
a.issue_id,
@running:=if(@previous=a.issue_id,@running,0) + 1 as row_number,
@previous:=a.issue_id,
a.attachment
FROM Attachments a
JOIN (SELECT @previous := 0) r
ORDER BY a.issue_id, a.attachment
) D ON I.ID = D.issue_id
GROUP BY I.Id, I.Title');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
這裏是SQL Fiddle。
+1。在內聯視圖中重新命名'@previous:= NULL'爲別名爲'r'是很好的,以便將語句與存儲在變量@previous中的任何先前值隔離。在內聯視圖別名爲「d」時,SELECT列表中的第一個a.issue_id是多餘的;可以在設置@previous:= a.issue_id的行上分配列別名'issue_id'。另外,在內聯視圖中的ORDER BY會使語句更具確定性,因爲附件將以指定的順序返回,而不是允許MySQL以任意順序返回它們。 – spencer7593 2013-02-09 01:55:36
@ spencer7593 - 精彩評論,非常感謝!我從以前的版本錯誤地留下了curRow :)我編輯了我的回覆 - 再次感謝! – sgeddes 2013-02-09 02:05:23
@sgeddes - 謝謝!這很棒,滿足了我的迫切需求。接下來,我將不得不弄清楚如何通過使用按ID分組的附件的最大數量來獲得相同的結果(這就是我如何從12開始)。因此,當一個id的最大潛在附件更改時,列也會動態更改。如果你知道如何做到這一點,它將完全解決我的使用案例! – 2013-02-15 00:56:53