【问题标题】:Selecting MYSQL rows with same field names and adding a prefix选择具有相同字段名称的MYSQL行并添加前缀
【发布时间】:2013-03-22 13:37:47
【问题描述】:

我正在尝试进行 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 . * 让它失败了,有没有办法做到这一点?所以它将是名称作为帐户。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您不能为列别名提供简写,您必须为每个列名明确地这样做。无论如何,通常建议在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
    

    【讨论】:

    • 别无他法?因为这需要大量的 SQL
    • @SauliusAntanavicius 不,没有语法简写。
    • 努力……哈哈,已经14行SQL了!但比通过 [14] 等访问行更好,错误的可能性太多
    【解决方案2】:

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

    在我编写自己的函数来解决它之前,我也需要它。如果您使用的是 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2017-09-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多