MYSQL как предложение, находящее слишком много совпадений - PullRequest
0 голосов
/ 29 марта 2012

Вчера одна женщина, которая использует отчет о проданных продуктах, пришла ко мне с проблемой.Отчет возвращает список всех продуктов, которые мы продаем с подсчетом за определенный период времени.В отчете было слишком много результатов по одному продукту.Строка "страница продажи" продукта также учитывает "страницу неограниченной продажи" - продукт обновления, который мы продаем.

Этот код дал неправильные результаты:

Select count(WorkOrderId) as cnt from tblworkorder 
where PlanName LIKE '%{$row['PlanType']}%' and RecTime BETWEEN '$stime' and '$etime'

Проблема должнас подстановочными совпадениями.Однако из-за того, как мой предшественник настроил БД, это необходимо.Продажа может состоять из нескольких продуктов, каждый из которых указан по имени в столбце PlanName, разделенных запятыми.Например,

PlanName = Sale Page, Domain Name,
PlanName = Link, Unlimited Sale Page, 

В то время как правильный ответ равен 1 в каждой строке, текущий код будет возвращен:

Domain Name = 1
Link = 1
Sale Page = 2
Unlimited Sale Page = 1

Если бы продукт был «Продажа Page-Unlimited», я мог бы получитьдобавьте запятую в конец имени плана, которое он ищет (например, «Страница продажи»).Поскольку проблема стоит на первом месте (и я не могу гарантировать, что страница продажи всегда будет первой в списке), это не решит эту проблему.Но это может предотвратить подобную проблему в будущем.

Без реструктуризации базы данных, чтобы иметь столбец, в котором планы перечислены по номеру (например, «P4, P16, P25» или «P1, P11») илитаблица соединений, как я могу найти на странице только страницу продажи, а не страницу неограниченной продажи при запуске отчета?

1 Ответ

1 голос
/ 29 марта 2012

Вы можете попробовать использовать FIND_IN_SET , что будет переводить что-то вроде

SELECT 
    count(WorkOrderId) as cnt 
FROM tblworkorder 
WHERE FIND_IN_SET('{$row['PlanType']}',PlanName)>0 
  AND RecTime BETWEEN '$stime' and '$etime'

Но реальный ответ - нормализовать ваши данные, чтобы у вас была таблица заказов и таблица orderPlans со столбцами внешнего ключа, связанными с order_ids и plan_ids.

...