sql >> Databasteknik >  >> RDS >> Mysql

Hur kombinerar man LIKE med IN i en MYSQL-fråga?

Först och främst är det quote inte Quote . För det andra bör du använda quoteName() för namn på fält. För det tredje finns det ingen anledning att sluta använda API bara för att du har en underfråga. Din kod är också mycket förvirrande om vilket som är fältnamnet och vilket som är värdet. Jag antar att $sf_value representerar värdet som du försöker matcha och adcfvc.field är namnet på fältet som lagrar data som du försöker matcha.

Byt ut

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

med

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

Jag är inte säker på varför du använder JString där men om du känner att det är nödvändigt är det bra.

Här är din underfråga

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 eftersom du har $db redan.

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

Sedan i den översta nivåfrågan, som du just har visat oss en del av, något i stil med

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


  1. Hur man installerar och säkrar MariaDB på Ubuntu

  2. PL/SQL-program för att ta bort posterna från tabellen

  3. Python från grunden:Skapa en dynamisk webbplats

  4. CONVERT() från datum/tid till strängexempel i SQL Server