sql >> Databasteknik >  >> RDS >> Mysql

SQL-fråga för att matcha en kommaseparerad sträng mot en kommaseparerad sträng?

Det är inte praktiskt att matcha något värde i en kommaseparerad sträng mot något värde i en annan kommaseparerad sträng i ett enda predikat.

Du kan använda FIND_IN_SET() för att söka efter ett värde åt gången.

Det betyder att du behöver flera predikat, ett för varje värde du får genom att dela upp din indata $subsector_text . Så dela upp din variabel och mappa den till en serie FIND_IN_SET()-anrop.

Jag har inte testat följande kod, men den borde ge dig en uppfattning om vad jag pratar 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)
...";

Detta kommer naturligtvis att tvinga fram en tabellsökning eftersom det inte finns något sätt att indexera FIND_IN_SET(), eller någon annan operation som söker efter delsträngar. Tja, jag antar att dina villkor för a.state och a.sector kommer att använda ett index för att begränsa sökningen innan villkoren FIND_IN_SET() tillämpas.

Jag förstår dilemmat med att behöva arbeta med ett system som du ärvt. Låt din chef veta att det här behöver omstruktureras någon gång, eftersom det aldrig kommer att vara effektivt eller tillförlitligt som det är designat nu.



  1. Bästa sättet att ringa en webbtjänst från TSQL

  2. Beställ flera kolumner ASC

  3. Hur tar man bort kaskad när föräldra-ID och barn-ID finns på samma bord?

  4. Skapa Oracle Cursor med Java-program