2012-05-02 105 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; 
} 
相关问题