Има нещо странно във вашата клауза where.
Ако тествате:(A И B) ИЛИ (A ИЛИ B)
A => a.establishment_name LIKE '".$search_value."'
B => a.location_id = '".$location_search_value."'
АКО А е вярно, тогава няма нужда b да е вярно. И това обяснява, че вашият трети пример не работи. Мисля, че трябва да тествате стойността си и да създадете правилната клауза WHERE въз основа на вашето обяснение.
if($search_value != "" && $location_search_value == "") {
$where = "a.establishment_name LIKE '".$search_value."'";
} else if ($search_value == "" && $location_search_value != "") {
$where = "a.location_id = '".$location_search_value."'";
} else {
$where = "(a.establishment_name LIKE '".$search_value."' AND a.location_id = '".$location_search_value."')";
}
$query = "SELECT a.*, b.location_name ".
"FROM establishment a ".
"JOIN location b ON a.location_id = b.location_id ".
"WHERE ".$where;