Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como combinar LIKE com IN em uma consulta MYSQL?


Primeiro de tudo é quote não Quote .Segundo, você deve usar quoteName() para nomes de campos.Terceiro não há razão para parar de usar a API só porque você tem uma subconsulta. Além disso, seu código está muito confuso sobre qual é o nome do campo e qual é o valor. Presumo que $sf_value representa o valor que você está tentando corresponder e adcfvc.field é o nome do campo que armazena os dados que você está tentando corresponder.

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

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

Não sei por que você está usando JString lá, mas se achar necessário, tudo bem.

Aqui está sua 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

Então você já que tem $db já.
$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) . '%')) ;

Em seguida, na consulta de nível superior, da qual você acabou de nos mostrar uma parte, algo como
$query->where('p.id IN (' . $subquery . ')' );