如何使用过滤器将多次出现的记录与主记录连接起来

时间:2013-05-18 13:28:24

标签: mysql left-join

我有一张表格,展示了一个庞大的产品库。

我有几个过滤器可以通过Kendo Grid应用到表中,但我遇到的问题只涉及MySQL。

我有一个日期范围过滤器,需要按销售时过滤产品列表。

我遇到的问题是,由于产品可能已售出多次,因此会导致产品系列重复,因为它们例如是一个产品的四个“dateSold”行。我知道为什么会这样,但我无法弄清楚如何为我的过滤器做语法:

SELECT ...
FROM parts_library
LEFT JOIN parts_sale_dates AS PSD ON PSD.partLibId = parts_library.id

应用日期过滤器时,它看起来像这样:

SELECT ...
FROM parts_library
LEFT JOIN parts_sale_dates AS PSD ON PSD.partLibId = parts_library.id
WHERE PSD.dateSold >= ?

另一个问题是做:

SELECT ...
FROM parts_library
LEFT JOIN parts_sale_dates AS PSD ON PSD.partLibId = parts_library.id

使查询采用驴,因为有大约500,000个产品。

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找像“之间”这样的东西:

SELECT ...
FROM parts_library pl LEFT JOIN
     parts_sale_dates psd
     ON PSD.partLibId = pl.id
WHERE PSD.dateSold between <DATE1> and <DATE2>;

如果您希望没有重复的部分,您可以将其表达为:

SELECT distinct pl.*
FROM parts_library pl LEFT JOIN
     parts_sale_dates psd
     ON PSD.partLibId = pl.id
WHERE PSD.dateSold between <DATE1> and <DATE2>;

对于大数据集的表现,我不会说好。

以下是等效的,但应该有更好的表现:

select pl.*
from parts_library pl
where exists (select 1
              from parts_sales_dates psd
              where psd.partLibId = pl.id and
                    psd.dateSold between <DATE1> and <DATE2>
             )

您可以通过parts_sales_dates(partsLibId, dateSold)上的索引来提高效果。