0

製品の大きなライブラリを示すテーブルがあります。

Kendo Grid を介してテーブルに適用できるフィルターがいくつかありますが、問題は MySQL だけに関係しています。

製品のリストを販売時期でフィルタリングする必要がある日付範囲フィルターがあります。

私が抱えている問題は、製品が複数回販売された可能性があるため、製品ラインが重複することです。たとえば、1 つの製品に対して 4 つの「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 の製品があるため、クエリにロバがかかります。

4

1 に答える 1

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)

于 2013-05-18T13:43:15.987 に答える