Mysql 如何使用筛选器将多个记录与主记录关联
我有一张桌子,上面有一个很大的产品库 我有几个过滤器可以通过剑道网格应用到表中,但我遇到的问题只与MySQL有关 我有一个日期范围过滤器,它需要根据产品的销售时间过滤产品列表 我遇到的问题是,因为一个产品可能已经销售了不止一次,它会导致产品线重复,因为它们是一个产品的四个DateSeld行。我知道这是为什么,但我不知道如何为我的过滤器执行语法:Mysql 如何使用筛选器将多个记录与主记录关联,mysql,left-join,Mysql,Left Join,我有一张桌子,上面有一个很大的产品库 我有几个过滤器可以通过剑道网格应用到表中,但我遇到的问题只与MySQL有关 我有一个日期范围过滤器,它需要根据产品的销售时间过滤产品列表 我遇到的问题是,因为一个产品可能已经销售了不止一次,它会导致产品线重复,因为它们是一个产品的四个DateSeld行。我知道这是为什么,但我不知道如何为我的过滤器执行语法: SELECT ... FROM parts_library LEFT JOIN parts_sale_dates AS PSD ON PSD.partL
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
因为大约有500000种产品,所以该查询需要使用驴子。我认为您正在寻找类似以下两者之间的产品:
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>
)
您可以通过在零件_sales _datespartsLibId,datesell上建立索引来提高性能。您需要什么索引have@DrewPierceParts_sale_dates是一个内存表,在partLibId上有索引,主键是id。是否切换到普通表更好?@MahmoudGamal日期过滤器是我不确定的。一个产品可能销售了0次或更多次。日期过滤器将检查销售日期是否在用户指定的范围内。+1谢谢,这使它返回了我想要的结果,但当它试图返回大量结果时,性能非常糟糕:@imperium2335。如果你有500000种产品,你可能有一个非常大的桌子。研究诸如数据分区之类的策略,并确保您的MySQL选项设置为优化可用硬件的使用。