2012-01-08 10 views
1

私はこのクエリを得ました。私は正しいと思った方法で書いていますが、何千もの結果を返しています。MySQLの簡単な検索クエリ

SELECT DISTINCT a.id,a.name 
FROM auctioneers a,auctioneersloc al, auctioneerscont ac 
WHERE a.email LIKE "%[email protected]%" 
OR ac.email LIKE "%[email protected]%" 
ORDER BY name 

私はあなたが私がここでやろうとしているかを見ることができると思いますが、私は私が間違ってやったものを見ることができません!
ご協力いただきありがとうございます。 :)

答えて

2

をされて使用しているところに含めることによって、 「デカルト製品」として知られています(1つのテーブルのすべてのレコードが別のテーブルのすべてのレコードに結合されています)。これは、 "ON"条件または(適切な) "WHERE"条件を指定せずにテーブルを結合すると起こります。

一般的なフィールドが3つのテーブルをリンクしているかどうかわからない場合は、a.idを使用してauctioneerslocとauctioneerscontテーブルに "auctioneers_id"というforiegnキーフィールドが存在すると仮定します。あなたの「競売」テーブルの行がは、あなたがすべき、その後、「auctioneersloc」または「auctioneerscont」の表に一致する行を必要としない場合は、もちろん

SELECT DISTINCT a.id,a.name 
FROM auctioneers a 
INNER JOIN auctioneersloc al ON al.auctioneers_id = a.id 
INNER JOIN auctioneerscont ac ON ac.auctioneers_id = a.id 
WHERE a.email LIKE "%[email protected]%" 
OR ac.email LIKE "%[email protected]%" 
ORDER BY name 

:しかし、あなたはこのようなものをお勧めしますLEFT JOINを使用します(INNER JOINではなく)。

個人的な様式のメモの上で、私はに常にに私のJOINを明示的に指定しようとします。 FROM句のすべてのテーブルをリストするだけで動作しますが、WHERE句を使用してJOIN条件を指定します。これは、アプリケーション開発の観点からは悪い可能性があります。クエリー文字列を作成するときにWHERE句に何か問題が発生すると、デカルト積が得られます。常にJOINキーワードを指定することを覚えておくと、このような偶発的なCPからあなたを救うことができます。

+0

助けてくれてありがとう。完璧に働いた。残念ながら、私がMySQLを愛していて、それを大好きに思っているのと同じくらい、私はジョインを読んで基本的に理解していますが、外来キーのようなMySQLの多くがそうであるように、 :( 再度、感謝します。 –

2

あなたは、あなたが

などを使用している別のテーブルを結合する方法を定義する必要があります。このことを決して忘れないためのa.id = al.auction_idのようなもの(あなたのDBの構造に応じて)

最も簡単な方法は、あなたが経験している何joinコマンドに;-)

+0

本当に間違いありませんか?私は、すでにオークション参加者がオークションに参加していないので、オークション参加者のために不思議に思っています。私はちょうど最後にオークションの連絡先の部分を追加しました。 :S –

+1

@ i-CONICA FROM句に複数のテーブルをリストすると、暗黙的にINNER JOINが実行されます。 – Aaron