2012-01-08 267 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

你所遇到的稱爲「笛卡爾積(Cartesian product)」(一張表中的每條記錄都與另一張表中的每條記錄相連)。當你連接表時沒有指定任何「ON」或(適當的)「WHERE」條件時會發生什麼情況。

如果不知道常用字段將三個表連接在一起,我將使用a.id並假定auctioneersloc和auctioneerscont表中存在名爲「auctioneers_id」的foriegn關鍵字段。但是,你想要的東西,看起來像這樣:

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 

當然,如果你的「拍賣」表中的行不要求在「auctioneersloc」匹配行或「auctioneerscont」表,那麼你應該使用LEFT JOIN(而不是INNER JOIN)。

關於更多的個人風格筆記,我嘗試總是明確指定我的JOIN。簡單地列出FROM子句中的所有表,但它依賴於WHERE子句來指定您的JOIN條件。從應用程序開發的角度來看,這可能是不好的,如果在構建查詢字符串時發生了WHERE子句,那麼您將得到一個Cartesian產品。始終記住指定JOIN關鍵字應該可以幫助您避免意外的CP。

+0

感謝您的幫助。完美工作。不幸的是,儘管我喜歡MySQL,並且很喜歡它,但我已經閱讀了聯接並基本理解了它們,但它們對我來說似乎仍然是巫術,就像許多MySQL像外鍵等一樣。 :( 再次感謝。 – 2012-01-09 19:51:32

2

你應該定義你怎麼想加入你正在使用

例如不同的表。由包入其中,像a.id = al.auction_id(取決於你的數據庫結構)

最簡單的方式永遠不會忘記這是通過使用join命令;-)

+0

你確定這是正確的嗎?我想知道,因爲沒有聯合使用,拍賣人a,auctioneersloc al部分?我剛剛附加了auctioneerscont ac部分。 :S – 2012-01-09 00:05:00

+1

@ i-CONICA當您在FROM子句中列出多個表時,您隱式執行INNER JOIN。 – Aaron 2012-01-09 00:07:35