选择具有相同字段名称的MYSQL行并添加前缀

时间:2012-05-02 02:25:04

标签: mysql

我正在尝试创建一个mysql查询来选择几个表并将它们连接起来,但它们都有相同的列名称'user'等。我想以这种方式重命名所有字段。所以我尝试了以下查询

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
}