2012-04-17 2 views
1

У меня есть страница поиска, которая имеет несколько полей, которые используются для создания изысканного поиска. Каждое поле является необязательным. Я пытаюсь начать обработку моего SQL-запроса, чтобы он работал с учетом правильных переменных, но у меня проблемы.Разрешение дополнительных параметров для MySQL Query

Вот запрос SQL я в настоящее время:

SELECT 
    indicator.indid, 
    indicator.indicator, 
    indtype.indtype, 
    provider.provider, 
    report.report, 
    actor.actor 
FROM 
    actor, 
    indicator, 
    indtype, 
    report, 
    provider 
WHERE 
    indicator.indtypeid = indtype.indtypeid 
    AND indicator.actorid = actor.actorid 
    AND indicator.reportid = report.reportid 
    AND report.providerid = provider.providerid 
    AND indicator.indicator LIKE '%$indicator%' 
    AND indicator.indtypeid = $indtypeid; 

Всякий раз, когда я обеспечить indicator и indtypeid, поиск работает просто отлично. Однако, когда я оставляю поле indtypeid пустым и имеет значение переменной * (в качестве значения по умолчанию), запрос не возвращает никаких результатов. Я пробовал играть с запросом вручную, и мне кажется, что не нравится * или знак %. В принципе, если указан только индикатор, и не указан indtypeid, я хочу вернуть все индикаторы для всех indtypeids.

Я уверен, что у меня что-то не хватает, но я был бы признателен за любую помощь, которая может быть предоставлена. Во-первых, возможно, я ошибаюсь.

ответ

4

Попробуйте вместо этого:

SELECT i.indid, i.indicator, it.indtype, 
     p.provider, r.report, a.actor 
FROM actor a 
INNER JOIN indicator i ON a.actorid = i.actorid 
INNER JOIN indtype it ON i.indtypeid = it.indtypeid 
INNER JOIN report r ON i.reportid = r.reportid 
INNER JOIN provider p ON r.providerid = p.providerid 
WHERE 1 = 1 
    AND ($indicator IS NULL OR i.indicator LIKE '%$indicator%') 
    AND ($indtypeid IS NULL OR i.indtypeid = $indtypeid); 

Так что, если вы передаете $indicator = NULL, то первое условие AND ($indicator IS NULL OR i.indicator LIKE '%$indicator%') будет игнорироваться, так как он будет решать True, и то же самое для второго условия.

Я удалил другие Where состояния и заменить их JOIN с, а для WHERE 1 = 1 сделать работу запроса штраф в случае, если передать две переменные $indicator и $indtypeidNULL с значениями для каждого, в этом случае он будет возвращать все результаты с 1 = 1 всегда tre.

+0

Это имеет смысл для меня, но когда я бросаю его в свой скрипт, он, похоже, не работает. Он не возвращает никаких результатов независимо от того, какую комбинацию атрибутов я использую. –

+0

Я попытался использовать это вручную, удалив имя переменной и проверку NOT NULL переменной, просто чтобы увидеть, могу ли я заставить ее работать без скрипта, но не получаю никаких результатов. ВЫБОР i.indid, i.indicator, it.indtype, p.provider, r.report, a.actor ОТ актеру INNER JOIN индикатор I ON a.actorid = i.actorid INNER JOIN indtype это ПО i.indtypeid = it.indtypeid INNER JOIN отчета г на i.reportid = r.reportid INNER JOIN провайдера р на r.providerid = p.providerid ГДЕ 1 = 1 И (i.indicator LIKE '% плохо%') И (i.indtypeid = '*'); –

+0

@ChrisSanders, проверьте свои соединения и ваши отношения между ними, запрос должен работать только для 'Where 1 = 1' и должен возвращать все данные, иначе в ваших соединениях будет проблема. –

Смежные вопросы