SQL INNER JOIN DISTINCT

时间:2012-08-26 16:15:38

标签: sql join distinct inner-join

我有表产品列表。执行以下查询时:

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

基本上我想通过listingsPRODUCT_NUMBER表创建与product表匹配的结果行​​。这对于电话列表网站的搜索功能来说更精确。

更具体地说,搜索功能使用products表进行搜索,然后使用listings表格显示有关电话列表的有用信息。

ANSWER

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

以上就是这个伎俩;简单地将桌子交换成圆形。我还在listings中插入了更多行,“问题”消失了。即使它没有解决,也不再发生......不确定问题是什么。

2 个答案:

答案 0 :(得分:2)

我相信你只是期待来自DISTINCT的某些东西不会那样......

假设您的表Products包含IDName,表Listings包含IDProductID(FK到{{清单_date`(只是为了让事情变得更简单......)

此外,假设您的表格Products), and有条目:

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 关键字应用于所有列 - 仅当结果集中的所有列相同时,才会过滤掉一行。< / p>

根据您的评论,我认为您应该排除包含DISTINCTID = 1的“重复”产品。这是 NOT 情况 - 请参阅结果集 - 如果查看所有四列,那两行Name = Foobar NOT 相同 - 因此,他们会两者都出现了。

这就是定义ProdID = 1关键字的方式。

如果你想“过滤掉”ID = 1的重复产品 - DISTINCT表中的哪两个条目你希望显示在结果集中?

答案 1 :(得分:1)

如果有记录中有2个列表加入单个产品,那么这将产生您所看到的内容:

select内部连接的结果

我将使用公共连接值从每个表中选择*并查看结果

HTH

伊恩