2012-08-26 166 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' 祝删除重复。 –