83

OK、これが私のジレンマです。データベースには、まったく同じデータ構造を持つ約 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

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

4

6 に答える 6

179

UNION句を探していると思います。

(SELECT * from us_music where `genre` = 'punk')
UNION
(SELECT * from de_music where `genre` = 'punk')
于 2009-01-03T20:00:37.413 に答える
19

テーブルが 1 つの方がよさそうです。5 つは同じスキーマを持ち、1 つのテーブルからすべてを 1 つのテーブルに入れることをポイントしているかのように提示する必要がある場合があります。

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

于 2009-01-03T20:00:43.483 に答える
5

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

SELECT * from us_music, de_music where `us_music.genre` = 'punk' AND `de_music.genre` = 'punk'
于 2009-01-03T20:06:50.193 に答える
4

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

于 2009-01-03T20:12:00.323 に答える
3

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

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

于 2009-01-05T23:51:04.437 に答える
3

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

  1. IDを選択
  2. 次に、メインテーブルを選択します
于 2009-11-07T13:33:31.903 に答える