3

我正在尝试进行 mysql 查询以选择多个表并 LEFT 加入它们,但是它们都有相同的列名“用户”等。我想以这种方式重命名所有字段。所以我尝试了以下查询

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 . *它失败了,有没有办法做到这一点?所以它将名称作为帐户。

4

2 回答 2

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
于 2012-05-02T02:27:06.577 回答
-1

我完全理解您关于重复字段名称的问题。

在我编写自己的函数来解决它之前,我也需要它。如果您使用的是 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;
}
于 2013-03-22T05:37:47.353 回答