2012-08-26 165 views
1

我有表產品列表。在做下面的查詢:SQL INNER JOIN DISTINCT

SELECT DISTINCT * 
FROM products 
INNER JOIN listings 
ON products.product_number=listings.product_number 

這是「搜索」功能:

WHERE products.product_number !='' 
AND listings.monthly_price BETWEEN '0' AND '10' 

這返回的產品清單之一的雙項。爲什麼不是DISTINCT工作?

編輯

產品:

product_number, make, model model_number, colour, processor, battery_standby, battery_talk, camera, flash, screen_size, screen_res, memory 

人數:

listing_number, featured, date, member_id, network, length, product_number, monthly_price, minutes, texts, data, image1 

從本質上講,我想通過自己的PRODUCT_NUMBER創建結果行匹配listings表到product表。這是爲了使手機列表網站的搜索功能更精確。

具體而言,搜索功能使用products表進行搜索,然後使用listings表顯示有關電話列表的有用信息。

ANSWER

SELECT DISTINCT * 
FROM listings 
INNER JOIN products 
ON products.product_number=listings.product_number 

上面確實起作用;只需將桌子交換一下。我還在listings中插入了幾行,「問題」消失了。即使它沒有解決,它不再發生了......不知道問題是什麼。

+1

「DISTINCT」適用於**所有**列 - 在您認爲是「雙重條目」的兩行中,所有**列都相同? –

+0

DISTINCT *將返回符合條件的'products'和'listings'中的所有字段的不同排列。當然,你的意思是DISTINCT products.productId,listings.listingid或類似的? – StuartLC

+0

它會建議您選擇的字段之一不同 – dougajmcdonald

回答

1

如果其中2名列表加入一個單一的產品,那麼這將產生你所看到的一個紀錄:

的SELECT DISTINCT位於內側的結果做加盟

我會使用常見的連接值來選擇每個表*,並查看結果

HTH

伊恩

+1

我會說,即使忘記了SELECT *,因爲它是一個壞主意,除了1%,當你真的需要一切:) –

+0

好吧謝謝:)那麼我怎麼在這種情況下寫一個「共同連接」。有關更多詳細信息,請參閱以下答案的評論。 –

+0

好吧,尼克,你處在一個相當陡峭的學習曲線的底部,但是有很多東西可以幫助你。當我開始的時候,我發現了「傻瓜系列」很好的書寫,並且非常擅長解釋基本的構建模塊。有一個「傻瓜SQL」。我希望它的寫作達到同樣的高標準。否則谷歌介紹建立SQL查詢或http://www.w3schools.com/sql/sql_intro.asp實際上SQL基礎知識不難,如果你通過閱讀「由Kalen Delany SQL」或http:// www .sqlserverinternals.com /你將知道你需要的東西 –

2

我相信你只是預計從DISTINCT的東西,不工作的方式....

假設你有一個表ProductsIDName和表ListingsIDProductID(FK到Products), and Listing_date`(只是爲了讓事情有點這裏更簡單....)

進一步假設你的表Products有條目:

ID  Name 
1  Foobar 
2  Bazfoo 

和表Listings有條目

ID ProductID ListingDate 
1  1   2012-01-01 
2  1   2012-03-01 
3  2   2012-04-01 

如果你加入這兩個表並應用DISTINCT

SELECT DISTINCT ProdID = p.ID, p.Name, ListingID = l.ID, l.ListingDate 
FROM dbo.Products p 
INNER JOIN dbo.Listings l ON l.ProductID = p.ID 

你期望什麼結果?

其結果將是:

ProdID Name ListingID ListingDate 
1  Foobar  1   2012-01-01 
1  Foobar  2   2012-03-01 
2  Bazfoo  3   2012-04-01 

DISTINCT關鍵字被施加到所有列 - 僅當所有列結果集中是相同的,那麼一個行將被過濾掉。

從您的意見中,我被引導認爲您應該排除ID = 1Name = Foobar的「重複」產品。這是不是的情況 - 見結果集 - 如果你看看所有四列,這兩行ProdID = 1不是相同 - 因此,他們都會出現。

這就是DISTINCT關鍵字定義的工作方式。

如果您想「過濾」ID = 1的副本產品 - 您希望Listings表中的兩個條目中的哪一個顯示在結果集中?

+0

我基本上想通過他們的PRODUCT_NUMBER創建與'listing'表匹配的結果行​​到產品表。這是爲了使手機列表網站的搜索功能更精確。 爲了更具體一些,搜索功能使用'產品'表進行搜索,然後在'LISTINGS'表中顯示有關電話列表的有用信息。 –

+0

@NickPrice:好的 - 但是又一次:**如果你想只顯示一行'ProdID = 1/Name = Foobar',那麼你需要顯示'Listings'中的哪一行** - 這裏有兩個'Products'中那一行的'Listings'中有更多的行 - 如果你只想顯示'Products'中的一行 - 你想查看'Listings'中的哪一行,你想忽略哪一行? ? –

+0

結果對問題的查詢: '37,蘋果,iPhone,4,Black' '36,蘋果iPhone,4S,White' '37,蘋果,iPhone,4,Black' 祝刪除重複。 –