sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo combinar LIKE con IN en una consulta MYSQL?

En primer lugar, es quote no Quote .En segundo lugar, debe usar quoteName() para los nombres de los campos. En tercer lugar, no hay razón para dejar de usar la API solo porque tiene una subconsulta. Además, su código es muy confuso sobre cuál es el nombre del campo y cuál es el valor. Supongo que $sf_value representa el valor que está tratando de hacer coincidir y adcfvc.field es el nombre del campo que almacena los datos que está tratando de hacer coincidir.

Reemplazar

 AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value

con

 AND ' .  $db->quoteName( 'adcfvc.field_value' ) . ' LIKE  ' .  $db->quote('%' . JString::strtolower($sf_value) . '%') 

No estoy seguro de por qué estás usando JString allí, pero si crees que es necesario, está bien.

Aquí está su subconsulta

SELECT adcfvc.advert_id
  FROM #__koparent_advert_specific_fields_values AS adcfvc
 WHERE adcfvc.advert_id = p.id
   AND adcfvc.field_name = ' . $db->Quote($sf_key) . '
   AND ' . $db->Quote(JString::strtolower($sf_value)) . ' = adcfvc.field_value

Así que ya tienes $db ya.

$subquery = $db->getQuery(true); 
// Assuming p.id is an integer
$subquery->where($db->quoteName(adcfvc.advert_id) = p.id)
//Assuming $sf_key is an integer
->where($db->quoteName(adcfvc.field_name) . ' = ' . $sf_key)
->where($db->quoteName(adcfvc.field_value) . ' LIKE ' 
    .   $db->Quote('%'. JString::strtolower($sf_value) . '%')) ;

Luego, en la consulta de nivel superior, de la que acaba de mostrarnos una parte, algo como

$query->where('p.id IN (' . $subquery . ')' );