Как объединить несколько вхождений записи в основную запись с фильтром
У меня есть таблица с большой библиотекой продуктов.
У меня есть несколько фильтров, которые можно применить к таблице через 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)
,