2013-05-18 25 views
0

我有一个表,它表明产品大的一个图书馆。如何加入记录的多次出现对主记录过滤

我有一个可以通过剑道电网应用到表中的多个过滤器,但我有这个问题只涉及的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个产品,因此使查询带驴子。

+0

什么索引你有 – Drew

+0

@DrewPierce Parts_sale_dates是内存中的表和对partLibId索引和主键ID。认为最好切换到普通表格吗? – imperium2335

+0

@MahmoudGamal日期过滤器是我不知道的。一个产品可能已被出售0次或更多次。日期过滤器会检查销售日期是否落在用户指定的范围内。 – imperium2335

回答

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)一个索引来改善性能。

+0

+1谢谢,这有它带回我想要的结果,但性能是可怕的,当它试图带回了不少成果:( – imperium2335

+0

的@ imperium2335。如果你有50万个产品,你可能有一个非常大的表调查诸如分区数据的策略,并确保你的MySQL选项设置为优化可用硬件的使用。 –