Esto ya se vuelve un problema de PHP y MySQL:
Tienes que usar los paréntesis y USE y TYPE son palabras reservadas. Por eso la etiqueta code te resalta en rojo esas palabras:
Está es una forma de hacerlo con PHP:
O una manera más sencilla de verla sin el reduce:
Después simplemente agregas las condiciones compuestas:
Claro que esto deja mucho que desear porque te pueden hacer SQL Injection. Puedes usar '?' en lugar de $valor si vas a usar prepared statements:
Luego simplemente haces el bind de las variables con un for. Ojo que los parámetros van en orden, y si tienes otros parámetros antes estos tienen que ser puestos primero.
Ultimadamente creo que sería mejor que en lugar de usar múltiples ORs usaras la función IN de MySQL:
Estoy seguro que te puedes imaginar formas de como agregar los valores tu solo a lo que hay dentro de el IN.
Tienes que usar los paréntesis y USE y TYPE son palabras reservadas. Por eso la etiqueta code te resalta en rojo esas palabras:
Código (mysql) [Seleccionar]
SELECT t1.id, t2.*
FROM for_sale t1
INNER JOIN property t2 ON t2.id = t1.id
WHERE t2.`USE` = 1
AND (t2.`TYPE` = 2 OR t2.`TYPE` = 1 OR t2.`TYPE` = 3)
AND (t2.`STATUS` = 0 OR t2.`STATUS` = 1 OR t2.`STATUS` = 2)
AND (t2.bhk = 3 OR t2.bhk = 1 OR t2.bhk = 2)
Está es una forma de hacerlo con PHP:
Código (php) [Seleccionar]
<?php
function agregaCondicionCompuesta($campo, $valores){
$red = function($acc, $valor) use ($campo){
$condicion = "$campo = $valor";
if($acc){
return $acc . ' OR ' . $condicion;
} else {
return $condicion;
}
};
$reduced = array_reduce($valores, $red);
return count($valores) > 1 ? "($reduced)" : $reduced;
}
O una manera más sencilla de verla sin el reduce:
Código (php) [Seleccionar]
function agregaCondicionCompuesta($campo, $valores){
$query = '';
foreach($valores as $index => $valor){
$condicion = "$campo = $valor";
if($index == 0){
$query .= $condicion;
} else {
$query .= ' OR ' . $condicion;
}
}
return count($valores) > 1 ? "($query)" : $query;
}
Después simplemente agregas las condiciones compuestas:
Código (php) [Seleccionar]
$filtros = [0, 1];
$use = [1];
echo agregaCondicionCompuesta('t2.`USE`', $use) . ' AND ' . agregaCondicionCompuesta('t2.`TYPE`', $filtros);
//t2.`USE` = 1 AND (t2.`TYPE` = 0 OR t2.`TYPE` = 1)
Claro que esto deja mucho que desear porque te pueden hacer SQL Injection. Puedes usar '?' en lugar de $valor si vas a usar prepared statements:
Código (php) [Seleccionar]
$condicion = "$campo = ?";
Luego simplemente haces el bind de las variables con un for. Ojo que los parámetros van en orden, y si tienes otros parámetros antes estos tienen que ser puestos primero.
Ultimadamente creo que sería mejor que en lugar de usar múltiples ORs usaras la función IN de MySQL:
Código (mysql) [Seleccionar]
SELECT t1.id, t2.*
FROM for_sale t1
INNER JOIN property t2 ON t2.id = t1.id
WHERE t2.`USE` = 1
AND t2.`TYPE` IN(1, 2, 3);
AND t2.`STATUS` IN(0, 1, 2)
AND t2.bhk IN(1, 2, 3)
Estoy seguro que te puedes imaginar formas de como agregar los valores tu solo a lo que hay dentro de el IN.