Il y a quelque chose d'étrange dans votre clause where.
Si vous testez :(A ET B) OU (A OU B)
A => a.establishment_name LIKE '".$search_value."'
B => a.location_id = '".$location_search_value."'
SI A est vrai, alors il n'est pas nécessaire que b soit vrai. Et ceci explique que votre troisième exemple ne fonctionne pas. Je pense que vous devriez tester votre valeur et créer la clause WHERE correcte en fonction de votre explication.
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;