我正在尝试创建一个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 . *
使它失败,有没有办法做到这一点?所以这将是帐户名称。
答案 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;
}