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

Hvordan kombineres LIKE med IN i en MYSQL-forespørgsel?

Først og fremmest er det quote ikke Quote .For det andet skal du bruge quoteName() for navne på felter. For det tredje er der ingen grund til at stoppe med at bruge API, bare fordi du har en underforespørgsel. Din kode er også meget forvirrende med hensyn til, hvad der er feltnavnet, og hvad der er værdien. Jeg antager, at $sf_value repræsenterer den værdi, du forsøger at matche, og adcfvc.field er navnet på det felt, der gemmer de data, du forsøger at matche.

Udskift

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

med

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

Jeg er ikke sikker på, hvorfor du bruger JString der, men hvis du føler, det er nødvendigt, så er det fint.

Her er din underforespørgsel

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
 

Så du, da du har $db allerede.

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

Så i forespørgslen på øverste niveau, som du lige har vist os en del af, noget som

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


  1. Nulstil automatisk stigningstæller i postgres

  2. MYSQL + PHP for at vise data fra to rækker som en enkelt kolonne

  3. TO_YMINTERVAL() Funktion i Oracle

  4. SQL Server JDBC-fejl på Java 8:Driveren kunne ikke etablere en sikker forbindelse til SQL Server ved at bruge Secure Sockets Layer (SSL) kryptering