Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie kombiniere ich LIKE mit IN in einer MYSQL-Abfrage?

Zunächst einmal ist es quote nicht Quote . Zweitens sollten Sie quoteName() verwenden für Namen von Feldern. Drittens gibt es keinen Grund, die API nicht mehr zu verwenden, nur weil Sie eine Unterabfrage haben. Außerdem ist Ihr Code sehr verwirrend, was der Feldname und was der Wert ist. Ich nehme an, dass $sf_value stellt den Wert dar, den Sie zuzuordnen versuchen, und adcfvc.field ist der Name des Felds, in dem die Daten gespeichert sind, die Sie abgleichen möchten.

Ersetzen Sie

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

mit

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

Ich bin mir nicht sicher, warum Sie dort JString verwenden, aber wenn Sie der Meinung sind, dass es notwendig ist, dann in Ordnung.

Hier ist Ihre Unterabfrage

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

Sie haben also $db schon.

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

Dann in der Abfrage der obersten Ebene, von der Sie uns gerade einen Teil gezeigt haben, so etwas wie

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