2014-03-27 44 views
1

我想從兩個表中以一種我從未做過的方式想出單個結果集,並且我在查找如何執行或甚至搜索什麼時遇到了一些麻煩在這些論壇。考慮以下的假設表中的數據:將列轉置爲列

Table1 
---------------------------------- 
ID | Name 
---------------------------------- 
1 | aa 
2 | bb 
3 | cc 
4 | dd 
5 | ee 


Table2 
---------------------------------- 
ID | Table1_ID | Value 
---------------------------------- 
1 | 1   | good 
2 | 2   | Dumb 
3 | 3   | Fat 
4 | 4   | Wet 
5 | 5   | High 
6 | 1   | Thin 
7 | 2   | Tall 
8 | 3   | Goofy 
9 | 4   | Rich 
10 | 5   | Funny 

我要尋找一個查詢或方法,讓我用下面的結果集結束: 代碼:

aa  | bb  | cc  | dd  | ee 
--------------------------------------------------------------- 
good  | Dumb | Fat  | Wet  | High 
Thin  | Tall | Goofy | Rich | Funny 

從本質上講,我想的能力從Table1中獲取名稱列表,將它們轉換爲列標題,然後將所有Table2的值放入其各自的列中,以便在任何列上進行排序。這可能嗎?

+2

您可以通過將數據邏輯保存到數組中來排序。你有嘗試過什麼嗎? –

+0

我不認爲這可以在原始SQL查詢本身完成。但在PHP代碼?當然......我可以讓Cheezburger說,如果你首先將所有東西都移動到一個數組中,你可以隨意修改它。 – Tularis

回答

0

當然這可以在SQL中完成。但它很棘手。由於數據是在問題中編寫的,因此您可以按組數爲t2.id進行分組。然後,查詢只是有條件的聚合。

select max(case when t2.table1_Id = 1 then value end) as aa, 
     max(case when t2.table1_Id = 2 then value end) as bb, 
     max(case when t2.table1_Id = 3 then value end) as cc, 
     max(case when t2.table1_Id = 4 then value end) as dd, 
     max(case when t2.table1_Id = 5 then value end) as ee 
from table2 t2 
group by cast(t2.id - 1/5 as int); 

有值將由其id s內隱式相關的似乎是一個非常非常糟糕的數據庫設計。應該有某種實體ID結合它們。

+0

謝謝你的迴應,但table1的ID是動態改變的......? – khan

+0

SQL查詢具有固定的列名稱。如果你想要變量列名,你將不得不使用動態SQL。 –

0

這裏有兩個問題: 1)使用值作爲列名不能以乾淨的方式完成 2)您想將table2.value分成2行:哪些值應該打開哪一排? Gordon Linoff爲此使用了table2.id字段,但是如果它是自動增量的,並且稍後您的數據會被添加/刪除,那麼節奏將會被打破。

以前一直有類似的問題。這其中有一個得到相當接近的答案:

mysql select dynamic row values as column names, another column as value

他們在這裏生成的查詢字符串,並作出事先準備好的聲明出來。