Изменение простого параметра нарушает MySql Query, когда NULL

0

Я изменил запрос в своем коде, потому что я хотел, чтобы пользователи выбирали конкретное значение из раскрывающегося списка, а не свободный текстовый поиск. В этом случае я должен приспособиться к тому, что, если пользователь не выбирает определенное значение, я все же хочу получить все соответствующие результаты. После изменения запрос возвращает "Нет результатов". Я очень озадачен, потому что много раз использовал подобный запрос. Вот исходный запрос, который работает:

SELECT 'companies'.'name', 'companies'.'website','country'.'country_name', 
        'company_sector'.'notes', 'sector'.'sector_name', 
        FORMAT('financials'.'revenues',0), 
        FORMAT('financials'.'ebitda',0) 
FROM { oj 'seta'.'company_sector' AS 'company_sector' 
    RIGHT OUTER JOIN 'seta'.'companies' AS 'companies' ON 'company_sector'.'company_id' = 'companies'.'company_id' 
    LEFT OUTER JOIN 'seta'.'country' AS 'country' ON 'country'.'country_id' = 'companies'.'country_id' 
    LEFT OUTER JOIN 'seta'.'financials' AS 'financials' ON 'financials'.'company_id' = 'companies'.'company_id' 
    LEFT OUTER JOIN 'seta'.'contacts' AS 'contacts' ON 'contacts'.'contact_id' = 'companies'.'seta_id' 
    }, 
'seta'.'sector' AS 'sector' 
WHERE 
      (
        ('company_sector'.'sector_id' = 'sector'.'sector_id')
      AND 
        ('companies'.'name' LIKE '%".$query_name."%')
      AND 
        ('company_sector'.'notes' LIKE '%".$query_product."%')
      AND 
        ('country'.'country_name' LIKE '%".$query_country."%')
      AND 
        ('sector'.'sector_name' LIKE '%".$query_sector."%')

Хотя это новый запрос, который не работает. Как вы можете видеть, я изменил только последние 2 строки.

SELECT 'companies'.'name', 'companies'.'website', 'country'.'country_name', 
        'company_sector'.'notes', 'sector'.'sector_name', 
        FORMAT('financials'.'revenues',0), 
        FORMAT('financials'.'ebitda',0) 
FROM { oj 'seta'.'company_sector' AS 'company_sector' 
    RIGHT OUTER JOIN 'seta'.'companies' AS 'companies' ON 'company_sector'.'company_id' = 'companies'.'company_id' 
    LEFT OUTER JOIN 'seta'.'country' AS 'country' ON 'country'.'country_id' = 'companies'.'country_id' 
    LEFT OUTER JOIN 'seta'.'financials' AS 'financials' ON 'financials'.'company_id' = 'companies'.'company_id' 
    LEFT OUTER JOIN 'seta'.'contacts' AS 'contacts' ON 'contacts'.'contact_id' = 'companies'.'seta_id' }, 'seta'.'sector' AS 'sector' 
WHERE 
     ( 
      ('company_sector'.'sector_id' = 'sector'.'sector_id')
      AND 
      ('companies'.'name' LIKE '%".$query_name."%')
      AND 
      ('company_sector'.'notes' LIKE '%".$query_product."%')
      AND
       (
        ('company_sector'.'sector_id' = ".$query_sector.") 
        OR 
        (".$query_sector." IS NULL)
       )
      ) 
       ORDER BY 'financials'.'revenues' ASC

Не могли бы вы помочь? С уважением, Томмазо

  • 0
    "не работает" означает что? Какой mysqli_error вы получаете? Каков результат каскадного запроса?
  • 0
    ".$query_sector." IS NULL это ваша проблема, попробуйте проверить ваши переменные через php, mysql может проверять только значения столбцов
Теги:

2 ответа

1
Лучший ответ

Разбейте запрос на разделы и добавьте значения фильтра, если выбран фильтр. см. пример ниже.

$query = "SELECT 'companies'.'name', 'companies'.'website', 'country'.'country_name', 'company_sector'.'notes', 'sector'.'sector_name', FORMAT('financials'.'revenues',0), FORMAT('financials'.'ebitda',0) FROM { oj 'seta'.'company_sector' AS 'company_sector' RIGHT OUTER JOIN 'seta'.'companies' AS 'companies' ON 'company_sector'.'company_id' = 'companies'.'company_id' LEFT OUTER JOIN 'seta'.'country' AS 'country' ON 'country'.'country_id' = 'companies'.'country_id' LEFT OUTER JOIN 'seta'.'financials' AS 'financials' ON 'financials'.'company_id' = 'companies'.'company_id' LEFT OUTER JOIN 'seta'.'contacts' AS 'contacts' ON 'contacts'.'contact_id' = 'companies'.'seta_id' }, 'seta'.'sector' AS 'sector' WHERE 
             ( 
              ('company_sector'.'sector_id' = 'sector'.'sector_id')
              AND 
              ('companies'.'name' LIKE '%".$query_name."%')
              AND 
              ('company_sector'.'notes' LIKE '%".$query_product."%')";

//check if filter is selected. 
if(!empty($query_sector)){
        $query .= " AND 'company_sector'.'sector_id' = ".$query_sector; //append to main query.
}

$query .= " ORDER BY 'financials'.'revenues' ASC";
  • 0
    Работал отлично! Спасибо!
  • 0
    Рад помочь :-)
0

Вы предполагаете, что пустая строка соответствует IS NULL с этой строкой:

(".$query_sector." IS NULL)

Это никогда не решится на истину.

Что вы имеете в виду:

(".$query_selector." = '')

Ещё вопросы

Сообщество Overcoder
Наверх
Меню