2011-12-02 88 views
4

我的最終目標是在MySQL中創建基於另一個表的內容的動態列的透視表視圖。此刻,我正試圖繼續從artfulsoftware脫落;現在我可以查詢結果,給我我想要的列名。不幸的是,我迷失在如何在SELECT語句中實際使用結果作爲列名。我懷疑MySQL變量會有幫助,但我無法弄清楚。如何在SELECT語句中將查詢結果用作列名稱

爲了澄清這個問題,說我有一個像表:

+---------------------------------------------------+ 
| countpivotarg          | 
+---------------------------------------------------+ 
| ,SUM(IF(domain = "test.com",1,0)) AS `test.com` | 
| ,SUM(IF(domain = "test2.com",1,0)) AS `test2.com` | 
+---------------------------------------------------+ 

我想創建一個select語句看起來像:

SELECT id, 
     meta_id, 
     SUM(IF(domain = "test.com",1,0)) AS `test.com`, 
     SUM(IF(domain = "test2.com",1,0)) AS `test2.com` 
FROM myTable; 

我如何去這樣做呢?

回答

2

您可以使用MySQL Server prepared statements來構建來自字符串變量的動態查詢。

實施例:

SELECT domain INTO @colname FROM myTable LIMIT 1; 
SET @s = CONCAT('SELECT `',@colname,'` FROM myTable'); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 

注意:反引號需要的情況下,列名包含空格。

+0

如何將結果導入到準備好的語句中使用的變量中? – JoBu1324

+0

@ JoBu1324聲明一個變量,並使用給定變量名稱的'SELECT x INTO x'。 –

+1

AFAIK,'SELECT @ variable_1:= field_1,@ variable_2:= field_2,... FROM ...'。請查看http://dev.mysql.com/doc/refman/5.0/en/user-variables.html。 'SELECT x into @ x'也會訣竅,謝謝@George! –

3

在SQL中,列名必須在查詢準備時固定 - 沒有例外。當你不知道列時設計一個動態數據透視查詢需要你以任何方式編寫應用程序代碼。您可以選擇使用預處理方法或後處理方法之間做出選擇:

  • 預處理:編寫一個查詢,取不同值的列表。然後將這些用作列名稱,並生成一個新的動態SQL查詢。

  • 後處理:編寫一個查詢以獲取數據作爲非旋轉結果,然後獲取所有數據並轉換爲另一種格式。

+0

我認爲謝爾蓋是在正確的軌道上 - 我沒有看到任何理由,我不能存儲結果一個變量中的查詢d在新語句中使用該變量。從聲明的角度來看,這些列名將事先知道。 – JoBu1324

+0

@ JoBu1324:Bill的回答完全正確 - 我所描述的正是預處理方法。 –

+0

我拿着「要求你編寫應用程序代碼」來表示它不能用SQL來完成 - 因此我的回答是,因爲我完全用SQL來完成它。 – JoBu1324

相關問題