2012-05-02 15 views
3

私はいくつかのテーブルを選択してLEFTを結合するためにmysqlクエリを作成しようとしていますが、それらはすべて同じカラム名 'user'などを持っています。フィールドをこのようにします。 mod_backup_accounts . * AS account . *が、それは失敗しますしかし、私は次のクエリ同じフィールド名で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 

を試みたが、これを行う方法はありますか?それはアカウントとしての名前になります。

答えて

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_num_fields()を持っている場合mysql_field_table()は、結果に行ごとにテーブル名とmysql_field_name()フィールドを返すということです。

「列」を追加するだけで機能を変更することもできます。フィールド名が重複している場合は接頭辞。

よろしく、

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; 
} 
関連する問題