1

我有表格PRODUCTSLISTINGS。执行以下查询时:

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

本质上,我想listings通过它们PRODUCT_NUMBERproduct表来创建与表匹配的结果行​​。这是为了更精确的电话列表网站的搜索功能。

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

回答

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

以上成功了;简单地交换桌子。我还在 中插入了几行listings,“问题”就消失了。即使它没有解决,它也不再发生......不知道问题是什么。

4

2 回答 2

2

我相信你只是期望从中得到一些东西DISTINCT是行不通的......

假设您有一个Products带有IDand的表,以及带有,的Name表(FK to Listing_date`(只是为了让事情在这里更简单......)ListingsIDProductIDProducts), 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

DISTINCT关键字应用于所有列- 只有当结果集中的所有列都相同时,才会过滤掉一行。

从您的评论中,我被引导相信您期望包含ID = 1并且Name = Foobar应该排除的“重复”产品。情况并非如此——查看结果集——如果你查看所有四列,那两行ProdID = 1并不相同——因此,它们都会出现。

这就是DISTINCT关键字被定义为工作的方式。

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

于 2012-08-26T19:51:48.837 回答
1

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

选择 distinct 是在内部连接的结果上完成的

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

高温高压

伊恩

于 2012-08-26T16:30:11.877 回答