web-dev-qa-db-ja.com

MySQL-すべて同じ構造で異なるデータを持つ複数のテーブルからデータを選択する

わかりました、ここに私のジレンマがあります。私は、すべて同じデータ構造を持つ約5つのテーブルでセットアップされたデータベースを持っています。データはこの方法でローカライズのために分離され、合計約450万レコードを分割します。

ほとんどの場合、必要なテーブルは1つだけで、すべてうまくいきます。ただし、2つ以上のテーブルからのデータが必要な場合があり、ユーザー定義の列でソートする必要があります。これは私が問題を抱えている場所です。

データ列:

id, band_name, song_name, album_name, genre

MySQLステートメント:

SELECT * from us_music, de_music where `genre` = 'punk'

MySQLはこのエラーを吐き出します:

#1052 - Column 'genre' in where clause is ambiguous

明らかに、私はこれを間違っています。誰も私のためにこれにいくつかの光を当てたいですか?

78
Jayrox

UNION 句を探していると思う

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
175

あなたは単一のテーブルでハッパになるように聞こえます。 5つのスキーマは同じであり、1つのテーブルから来たかのように表示する必要がある場合があります。

5つの言語を区別するために使用できる新しい列を追加します(ローカライズ用だと言ってから、テーブル間で言語が異なると仮定しています)。 450万件のレコードを心配する必要はありません。実際のデータベースは、そのサイズを問題なく処理できます。正しいインデックスを追加すれば、単一のテーブルとして問題なく扱うことができます。

19
Ned Batchelder

上記の回答のいずれかが有効であるか、別の方法は、テーブル名を展開してデータベース名も含めることです-例:

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
5
Moo

この列は両方のテーブルに表示されるため、us_music.genreやde_music.genreなどのwhere(またはsort)フィールドを完全に指定する必要がありますが、それらを一緒に結合する場合は通常2つのテーブルを指定します。いくつかのファッション。通常、データセットを任意に分割するのではなく、データセットを個別のファイルに分離することも行われますが、扱う構造はパーティションテーブルと呼ばれることもあります。データベース構造を担当しており、データをパーティション分割する正当な理由がない場合、国コードを含む追加の「Origin」フィールドを持つ大きなテーブルを作成しますが、おそらく正当なパフォーマンス上の理由でそれを行っています。ユニオンを使用して、関心のあるテーブルを結合します http://dev.mysql.com/doc/refman/5.0/en/union.html またはMergeデータベースエンジンを使用して- http://dev.mysql.com/doc/refman/5.1/en/merge-storage-engine.html .

4
Philip Mather

unionステートメントは、巨大なデータで取引時間を発生させます。 2つのステップで選択を実行することをお勧めします。

  1. iDを選択
  2. それでメインテーブルを選択します
3
mehdi mohamadi

両方のテーブルにまたがる元の試みは、暗黙的なJOINを作成します。これは、テーブルを分離して方法の条件と組み合わせるため、ほとんどの経験豊富なSQLプログラマーに嫌われています。

UNIONは、テーブルをそのまま使用するのに適したソリューションですが、まともなインデックスを付けて1つのテーブルに配置できない理由はありません。大きなテーブルに正しいインデックスを追加すると、クエリの速度が3桁向上します。

3
staticsan