Mysql
 sql >> Database >  >> RDS >> Mysql

Come combinare LIKE con IN in una query MYSQL?

Prima di tutto è quote non Quote .In secondo luogo dovresti usare quoteName() per i nomi dei campi. Terzo, non c'è motivo per smettere di usare l'API solo perché hai una sottoquery. Inoltre il tuo codice è molto confuso su quale sia il nome del campo e quale sia il valore. Presumo che $sf_value rappresenta il valore che stai cercando di abbinare e adcfvc.field è il nome del campo che memorizza i dati che stai cercando di abbinare.

Sostituisci

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

con

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

Non sono sicuro del motivo per cui stai usando JString lì, ma se ritieni che sia necessario, va bene.

Ecco la tua sottoquery

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

Quindi, dato che hai $db già.

$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) . '%')) ;

Quindi nella query di primo livello, di cui ci hai appena mostrato una parte, qualcosa come

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