2012-05-02 41 views
3

我試圖做一個mysql查詢來選擇幾個表,然後左連接它們,但它們都具有相同的列名「用戶」等我想重命名所有字段以這種方式。所以我嘗試下面的查詢選擇具有相同字段名稱的MYSQL行並添加前綴

SELECT mod_backup_accounts . * AS account . * , mod_backup_subscriptions . * 
FROM `mod_backup_accounts` 
LEFT JOIN `mod_backup_subscriptions` ON `mod_backup_accounts`.subscription_id = `mod_backup_subscriptions`.package_id 

然而mod_backup_accounts . * AS account . *使得它失敗了,有沒有辦法做到這一點?所以它會被稱爲帳戶。

回答

5

您不能爲別名列提供簡寫,您必須爲每個列名顯式地使用它。一般來說,通常建議在SELECT列表中明確列出所有列,而不是使用SELECT *,因爲它允許您確定性地指定列順序,並且可以保護您以防意外地在稍後添加一個較大的BLOB(如果有人添加)到表格(或任何其他架構更改)。

SELECT 
    mod_backup_accounts.user AS account_user, 
    mod_backup_subscriptions.user AS subscription_user, 
    ... 
    ... 
FROM 
    mod_backup_accounts 
    LEFT JOIN `mod_backup_subscriptions` ON `mod_backup_accounts`.subscription_id = `mod_backup_subscriptions`.package_id 
+0

沒有其他的辦法?因爲這需要大量的SQL –

+0

@SauliusAntanavicius不,對此沒有語法簡寫。 –

+5

一位好的程序員不願意輸入。 :) – Ami

0

我完全理解你的重複字段名稱的問題。

我也需要,直到我編寫我自己的函數來解決它。如果您正在使用PHP,則可以使用它,或者如果您擁有以下設施,則使用您使用的語言對其進行編碼。

的這裏訣竅是,在mysql_field_table()結果返回的表名和mysql_field_name()現場的每一行,如果它與mysql_num_fields()了,所以你可以在一個新的數組混合。

您也可以修改該功能以僅添加「列」。字段名稱重複時的前綴。

問候,

function mysql_rows_with_columns($query) { 
    $result = mysql_query($query); 
    if (!$result) return false; // mysql_error() could be used outside 
    $fields = mysql_num_fields($result); 
    $rows = array(); 
    while ($row = mysql_fetch_row($result)) { 
     $newRow = array(); 
     for ($i=0; $i<$fields; $i++) { 
      $table = mysql_field_table($result, $i); 
      $name = mysql_field_name($result, $i); 
      $newRow[$table . "." . $name] = $row[$i]; 
     } 
     $rows[] = $newRow; 
    } 
    mysql_free_result($result); 
    return $rows; 
} 
相關問題