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

SQL-forespørgsel til at matche en kommasepareret streng med en kommasepareret streng?

Det er ikke praktisk at matche nogen værdi i en kommasepareret streng med en hvilken som helst værdi i en anden kommasepareret streng i et enkelt prædikat.

Du kan bruge FIND_IN_SET() at søge efter én værdi ad gangen.

Det betyder, at du har brug for flere prædikater, et for hver værdi, du får ved at dele dit input $subsector_text . Så opdel din variabel og kortlæg den i en række FIND_IN_SET()-kald.

Jeg har ikke testet følgende kode, men den burde give dig en idé om, hvad jeg taler om:

$subsector_array = array_map('intval', explode(',', $subsector_text));
$subsector_terms = array_map(
  function ($id) { return "FIND_IN_SET($id, a.subsector)"; },
  $subsector_array);
$subsector_expr = implode(' OR ', $subsector_terms);

$sql = "
SELECT ...
          WHERE a.state = 1 
            AND a.sector = '$sector'
            AND ($subsector_expr)
...";

Dette vil selvfølgelig fremtvinge en tabelscanning, fordi der ikke er nogen måde at indeksere FIND_IN_SET(), eller nogen anden operation, der søger efter understrenge. Nå, jeg formoder, at dine betingelser på a.state og a.sector vil bruge et indeks til at indsnævre søgningen, før betingelserne FIND_IN_SET() anvendes.

Jeg forstår dilemmaet ved at skulle arbejde med et system, som du har arvet. Fortæl din leder, at dette skal ændres på et tidspunkt, fordi det aldrig vil være effektivt eller pålideligt, som det er designet nu.



  1. Ufanget undtagelse 'PDOException' med beskeden 'Der er ingen aktiv transaktion'?

  2. SQL IN vs SQL EKSISTERER

  3. Oprettelse af en database i Cloud Sites

  4. Oracle SQL-erklæring i java