Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment combiner LIKE avec IN dans une requête MYSQL ?

Tout d'abord c'est quote pas Quote .Deuxièmement, vous devez utiliser quoteName() pour les noms de champs. Troisièmement, il n'y a aucune raison d'arrêter d'utiliser l'API simplement parce que vous avez une sous-requête. De plus, votre code est très déroutant quant au nom du champ et à la valeur. Je suppose que $sf_value représente la valeur que vous essayez de faire correspondre et adcfvc.field est le nom du champ qui stocke les données que vous essayez de faire correspondre.

Remplacer

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

avec

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

Je ne sais pas pourquoi vous utilisez JString ici, mais si vous pensez que c'est nécessaire, alors très bien.

Voici votre sous-requête

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

Donc vous puisque vous avez $db dé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) . '%')) ;

Ensuite, dans la requête de niveau supérieur, dont vous venez de nous montrer une partie, quelque chose comme

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