2013-11-26 48 views
2

我需要一些幫助,使用sql查詢中的動態列名稱。首先,我將嘗試解釋我的數據庫結構,然後解決問題。取決於查詢結果的單行的動態列名稱

數據庫結構:

admin_group表:

+--------+----------------+ 
| id  | language_code | 
+--------+----------------+ 
| 1  | en_UK   | 
| 2  | de_DE   | 
| 3  | es_ES   | 
+--------+----------------+ 

constructions_meta表:

+--------+-----------------+----------+ 
| id  | admin_group_FK | value | 
+--------+-----------------+----------+ 
| 1  | 1    | 0.13  | 
| 2  | 2    | 0.12  | 
| 3  | 3    | 0.10  | 
+--------+-----------------+----------+ 

construction_lang表:

+--------+-----------------+----------------+----------------+ 
| id  | en_UK_name  | de_DE_name  |es_ES_name  | 
+--------+-----------------+----------------+----------------+ 
| 1  | Construction 1 | Konstruktion 1 | Construcción 1 |  
| 2  | Construction 2 | Konstruktion 2 | Construcción 2 | 
| 3  | Construction 3 | Konstruktion 3 | Construcción 3 | 
+--------+-----------------+----------------+----------------+ 

這些都是我的表數據庫。我需要的是獲得關於每個建築的語言代碼的結構名稱。例如,我要列出結構如下:

  1. 建設1
  2. Konstruktion 2
  3. Construcción3
+0

如果從PHP生成的輸出,您可以只編寫它......但是,如果你想放你的數據庫的工作量嘗試http://dev.mysql.com/doc/refman/5.0/en/case.html Mysql案例(如常規開關案例)來選擇所選的值。 –

回答

2

這可能是最容易做的是,在兩道。這將使您能夠擴展construction_lang表的寬度,而不會顯着影響SQL語句。

首先,您發出一條SQL語句來獲取所需的列名,然後使用該結果集構建第二條SQL語句,以便爲您獲取名稱。

這不是理想的解決方案,因爲它正在左右的數據模型。

由於返回的ID和語言admin_group符合的查詢:

array(array('id' => 1, 'language_code' => 'en_UK'), 
     array('id' => 2, 'language_code' => 'de_DE'), 
     array('id' => 3, 'language_code' => 'es_ES')) 

就可以構建沿東西線(作爲示例使用對方的回答從diarmuid)聲明

$sql = "select c.id , (select case c.admin_group_FK\r\n"; 
foreach($languages as $thisLanguage) { 
    $sql .= "when {$thisLanguage['id']} then l.${thisLanguage['language_code']}_name\r\n"; 
} 
$sql .= ... 

由於數據模型的原因,這是一個完整的方法。理想情況下,您不需要「動態」SQL。「

如果你想刪除的往返約岬,以及建立一些更符合標準的關係型數據庫理論線,那麼你可以改變模式,使construction_lang表更像是這樣的:

+------------------------+-----------------+----------------+ 
| constructions_meta_fk | language  | name   | 
+------------------------+-----------------+----------------+ 
| 1      | en_UK   | Construction 1 | 
| 1      | de_DE   | Konstruktion 1 | 
| 1      | es_ES   | Construcción 1 | 
| 2      | en_UK   | Construction 2 | 
| 2      | de_DE   | Konstruktion 2 | 
| 2      | es_ES   | Construcción 2 | 
| 3      | en_UK   | Construction 3 | 
| 3      | de_DE   | Konstruktion 3 | 
| 3      | es_ES   | Construcción 3 | 
+------------------------+-----------------+----------------+ 
+0

Hello Rob, 如何在第二個查詢中使用第一個查詢的結果集。我不能理解如何使用例如50個不同的列名構建第二個select語句。你能寫一個例子嗎? –

+0

您將構建非常類似於@diarmuid建議的語句,只需在PHP中動態構建case語句即可。儘管我強烈建議您改爲改用數據模型。解決方案會更簡單。 –

+0

已編輯答案更詳細地解釋 –

-2

你可以使用,如果condtion像`

if(admin_group_FK == 1) 
{ 
fetch['en_UK_name']; 
} 
if(admin_group_FK == 2) 
{ 
fetch['de_DE_name']; 
} 
if(admin_group_FK == 3) 
{ 
fetch['es_ES_name']; 
} 

`

3
select c.id , (select case c.admin_group_FK 
       when 1 then l.en_UK_name 
       when 2 then l.de_DE_name 
       else l.es_ES_name 
      end from construction_lang l where id = c.id) as construction_name, 
    c.value 
from constructions_meta c; 

是解決辦法只有一個讓任您工作,很快之一。 和Rob是關於提高了數據模型

解決方案正確的是:

,你需要和你的數據模型與該關聯表中刪除construction_lang表,並取代它很像是羅布提出

+------------------+--------------+----------------+ 
| construction_fk | language_fk | name  | 
+------------------+--------------+----------------+ 
| 1    | 1   | Construction 1 | 
| 1    | 2   | Konstruktion 1 | 
| 1    | 3   | Construcción 1 | 
| 2    | 1   | Construction 2 | 
| 2    | 2   | Konstruktion 2 | 
| 2    | 3   | Construcción 2 | 
| 3    | 1   | Construction 3 | 
| 3    | 2   | Konstruktion 3 | 
| 3    | 3   | Construcción 3 | 
+------------------+--------------+----------------+ 

然後查詢您所需要的

select c.id, l.language_code , a.name ,c.value 
from constructions_meta c 
join construction_lang_assoc a on a.construction_fk = c.id and a.language_fk = c.admin_group_FK 
join admin_group l on l.id = c.admin_group_FK; 
+0

這真是一個可行的解決方案。然而,使它自動化將會很棒。我的意思是:如果我再添加10種語言,我必須更改查詢。每次內容改變時我都必須改變它。 –

+0

創建一個語言和ID數組,並構造查詢。 '$ ar [1] =「en_UK」; $ ar [2] =「de_DE」; ...'。然後使用'foreach'構造查詢。 – Yousf

+0

你的意思是如果我有100條記錄,我必須構建100個查詢?你能否寫一個示例查詢,因爲我不確定我是否100%理解你的建議。 –

相關問題