Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何使用筛选器将多个记录与主记录关联_Mysql_Left Join - Fatal编程技术网

Mysql 如何使用筛选器将多个记录与主记录关联

Mysql 如何使用筛选器将多个记录与主记录关联,mysql,left-join,Mysql,Left Join,我有一张桌子,上面有一个很大的产品库 我有几个过滤器可以通过剑道网格应用到表中,但我遇到的问题只与MySQL有关 我有一个日期范围过滤器,它需要根据产品的销售时间过滤产品列表 我遇到的问题是,因为一个产品可能已经销售了不止一次,它会导致产品线重复,因为它们是一个产品的四个DateSeld行。我知道这是为什么,但我不知道如何为我的过滤器执行语法: SELECT ... FROM parts_library LEFT JOIN parts_sale_dates AS PSD ON PSD.partL

我有一张桌子,上面有一个很大的产品库

我有几个过滤器可以通过剑道网格应用到表中,但我遇到的问题只与MySQL有关

我有一个日期范围过滤器,它需要根据产品的销售时间过滤产品列表

我遇到的问题是,因为一个产品可能已经销售了不止一次,它会导致产品线重复,因为它们是一个产品的四个DateSeld行。我知道这是为什么,但我不知道如何为我的过滤器执行语法:

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选项设置为优化可用硬件的使用。