Как объединить несколько вхождений записи в основную запись с фильтром

У меня есть таблица с большой библиотекой продуктов.

У меня есть несколько фильтров, которые можно применить к таблице через 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

Делает запрос принять ослов, потому что есть около 500000 продуктов.

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),

Другие вопросы по тегам