2014-10-05 28 views
0

運行INNER JOIN類型的查詢時,我得到重複的列名稱,這可能會導致問題。這已經在這裏被廣泛地討論過了,我能夠找到解決這個問題的方法,除此之外它是相當合理的,只有我需要的列是SELECT使用INNER JOIN而不返回連接表中的任何列

但是,我想知道我怎麼可以運行這樣的查詢,而實際上沒有從連接的表中返回任何列。

這是我的MySQL查詢

SELECT * FROM product z 
    INNER JOIN crosslink__productXmanufacturer a 
    ON z.id = a.productId 
WHERE 
    (z.title LIKE "%search_term%" OR z.search_keywords LIKE "%search_term%") 
AND 
    z.availability = 1 
AND 
    a.manufacturerId IN (22,23,24) 

問題

我怎麼會爲了從這些柱product沒有crosslink__productXmanufacturer只返回列修改此MySQL查詢?

回答

4

將表名添加到*。更換

SELECT * FROM product z 

SELECT z.* FROM product z 
+0

簡單的這讓我感到羞恥!謝謝!! – SquareCat 2014-10-05 15:01:44

1

通常,當你這樣做,意圖可以使用inexists而非join再清楚不過了。該join被用於過濾,從而把狀態where子句中是有道理的:

SELECT p.* 
FROM product p 
WHERE (p.title LIKE '%search_term%' OR p.search_keywords LIKE '%search_term%') AND 
     p.availability = 1 AND 
     exists (SELECT 1 
       FROM pXm 
       WHERE pXm.productId = p.id AND pxm.manufacturerId IN (22, 23, 24) 
      ); 

有了正確的指標,這應該至少運行快如join版本(該指數是crosslink__productXmanufacturer(productId, manufacturerId)另外如果crosslink__productXmanufacturer中有多個匹配項,則不必擔心返回重複記錄

您可能會注意到我對查詢做了兩處其他小改動:首先,表別名是表名的縮寫,使邏輯易於遵循;其次,字符串常量使用單引號(ANSI標準)而不是雙引號引號。對於字符串和日期常量,僅使用單引號有助於防止無意的語法錯誤。

+0

這是寶貴的意見,幫助我更全面地理解這個問題。謝謝! – SquareCat 2014-10-05 15:15:05